3、模型下载与加载:从Hugging Face或ModelScope下载DeepSeek模型,并使用Transformers库加载
好,咱们进入实操环节。
模型下载与加载,说白了就是两件事:把模型文件从云端拉到本地,然后用代码把它“唤醒”。听起来简单,但坑不少。我刚开始接触时,光下载就卡了半小时——网络超时、路径不对、版本不匹配……嗯,今天我把这些坑都给你填平。
3.1 模型来源:Hugging Face vs ModelScope
目前主流的DeepSeek模型托管在两个平台:
| 平台 | 特点 | 适合场景 |
|---|---|---|
| Hugging Face | 全球最大,模型最全,但国内访问慢 | 海外部署、有代理环境 |
| ModelScope | 阿里出品,国内速度快,中文生态好 | 国内开发、无代理环境 |
我个人习惯:国内开发用ModelScope,下载速度能到10MB/s以上。Hugging Face虽然权威,但动不动就断连,你想想看,一个7B模型十几个G,下到一半断了多崩溃。
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com',速度会快很多。
3.2 从Hugging Face下载模型
先看Hugging Face的下载方式。我建议用snapshot_download,而不是手动一个个文件点。为什么?因为模型文件通常包含:
- config.json:模型配置
- model-00001-of-00002.safetensors:分片权重文件
- tokenizer.json:分词器
- generation_config.json:生成配置
手动下载容易漏,而且分片文件有几十个,你想想看,一个个点得多累。
from huggingface_hub import snapshot_download
# 下载DeepSeek-7B模型
model_id = "deepseek-ai/deepseek-llm-7b-chat"
local_dir = "./models/deepseek-7b"
snapshot_download(
repo_id=model_id,
local_dir=local_dir,
local_dir_use_symlinks=False,
resume_download=True # 支持断点续传
)
print(f"模型已下载到: {local_dir}")
注意resume_download=True这个参数。我曾经在公司网络不好的时候下载,断了三次,全靠它续命。没有这个参数,每次都得从头下,那叫一个绝望。
local_dir_use_symlinks=False没设置,结果下载的文件全是符号链接,一拷贝就失效。建议始终设为False,直接保存真实文件。
3.3 从ModelScope下载模型
ModelScope的下载方式类似,但API更简洁。我个人更喜欢它的snapshot_download,因为自带进度条,看着心里踏实。
from modelscope.hub.snapshot_download import snapshot_download
# 下载DeepSeek模型
model_id = "deepseek-ai/deepseek-llm-7b-chat"
local_dir = "./models/deepseek-7b"
snapshot_download(
model_id=model_id,
cache_dir=local_dir,
resume_download=True
)
print(f"模型已下载到: {local_dir}")
这里有个细节:ModelScope的cache_dir参数相当于Hugging Face的local_dir。别搞混了,否则文件会存到默认缓存路径,你找都找不到。
3.4 使用Transformers加载模型
模型下载好了,接下来就是加载。这里我强烈建议用AutoModelForCausalLM和AutoTokenizer,它们会自动识别模型类型,省去手动配置的麻烦。
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch
# 加载分词器
tokenizer = AutoTokenizer.from_pretrained(
"./models/deepseek-7b",
trust_remote_code=True # DeepSeek需要这个
)
# 加载模型
model = AutoModelForCausalLM.from_pretrained(
"./models/deepseek-7b",
torch_dtype=torch.float16, # 半精度,省显存
device_map="auto", # 自动分配设备
trust_remote_code=True
)
print("模型加载完成!")
嗯,这里要注意几个点:
- trust_remote_code=True:DeepSeek用了自定义代码,不加这个会报错。我第一次加载时没加,报了一堆红字,还以为模型坏了。
- torch_dtype=torch.float16:7B模型用float32需要14GB显存,float16只要7GB。如果你的显卡是RTX 3090或4090,用float16刚好能跑。
- device_map="auto":自动把模型层分配到GPU和CPU上。显存不够时,它会自动把部分层放到CPU,虽然慢点,但至少能跑。
3.5 验证模型是否加载成功
模型加载完,最好做个简单测试。我习惯用一句话来验证:
# 测试生成
input_text = "你好,请介绍一下你自己。"
inputs = tokenizer(input_text, return_tensors="pt").to("cuda")
outputs = model.generate(
inputs.input_ids,
max_new_tokens=100,
temperature=0.7,
do_sample=True
)
response = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(response)
如果输出正常,说明模型加载成功。如果报错,多半是路径问题或版本不匹配。我建议检查一下transformers库的版本,至少4.30以上。
3.6 知识体系总览
为了让你更直观地理解整个流程,我画了一张图:
3.7 常见问题与避坑
最后,分享几个我踩过的坑:
- 版本不匹配:DeepSeek模型需要transformers 4.30+,如果你用的是老版本,加载时会报
KeyError。我建议用pip install transformers --upgrade升级到最新。 - 磁盘空间不足:7B模型大约13GB,下载前确保磁盘有20GB以上剩余空间。我曾经在服务器上下到99%报错,就是因为/tmp目录满了。
- CUDA版本问题:如果你用GPU加载,确保PyTorch的CUDA版本和驱动匹配。可以用
torch.cuda.is_available()检查。
好了,模型下载和加载就讲到这里。记住:下载用snapshot_download,加载用AutoModel,这两个组合能解决90%的问题。剩下的10%,遇到具体报错再查文档就行。