3、模型下载与加载:从Hugging Face或ModelScope下载DeepSeek模型,并使用Transformers库加载

好,咱们进入实操环节。

模型下载与加载,说白了就是两件事:把模型文件从云端拉到本地,然后用代码把它“唤醒”。听起来简单,但坑不少。我刚开始接触时,光下载就卡了半小时——网络超时、路径不对、版本不匹配……嗯,今天我把这些坑都给你填平。

3.1 模型来源:Hugging Face vs ModelScope

目前主流的DeepSeek模型托管在两个平台:

平台 特点 适合场景
Hugging Face 全球最大,模型最全,但国内访问慢 海外部署、有代理环境
ModelScope 阿里出品,国内速度快,中文生态好 国内开发、无代理环境

我个人习惯:国内开发用ModelScope,下载速度能到10MB/s以上。Hugging Face虽然权威,但动不动就断连,你想想看,一个7B模型十几个G,下到一半断了多崩溃。

小技巧:如果你必须用Hugging Face,可以设置镜像站。在代码开头加一句: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加载模型

模型下载好了,接下来就是加载。这里我强烈建议用AutoModelForCausalLMAutoTokenizer,它们会自动识别模型类型,省去手动配置的麻烦。

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,虽然慢点,但至少能跑。
核心要点:加载模型时,显存是最大的瓶颈。7B模型至少需要8GB显存,13B模型需要16GB。如果显存不够,可以考虑量化版本(如4bit),但精度会略有下降。

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 知识体系总览

为了让你更直观地理解整个流程,我画了一张图:

模型下载与加载流程 选择模型来源 Hugging Face ModelScope snapshot_download 下载 AutoModel 加载 关键参数说明 • resume_download=True:断点续传 • trust_remote_code=True:自定义代码 • torch_dtype=float16:半精度省显存 • device_map="auto":自动分配设备 • local_dir_use_symlinks=False:真实文件 常见错误: • 网络超时 → 加镜像或换ModelScope • 显存不足 → 用float16或量化版本 • 路径错误 → 检查local_dir是否存在

3.7 常见问题与避坑

最后,分享几个我踩过的坑:

  1. 版本不匹配:DeepSeek模型需要transformers 4.30+,如果你用的是老版本,加载时会报KeyError。我建议用pip install transformers --upgrade升级到最新。
  2. 磁盘空间不足:7B模型大约13GB,下载前确保磁盘有20GB以上剩余空间。我曾经在服务器上下到99%报错,就是因为/tmp目录满了。
  3. CUDA版本问题:如果你用GPU加载,确保PyTorch的CUDA版本和驱动匹配。可以用torch.cuda.is_available()检查。
我的建议:第一次加载时,先用小模型(如1.3B版本)测试流程。跑通了再换大模型,这样能快速定位问题,避免浪费时间。

好了,模型下载和加载就讲到这里。记住:下载用snapshot_download,加载用AutoModel,这两个组合能解决90%的问题。剩下的10%,遇到具体报错再查文档就行。


专注资料整理