
模型文件拷进了无外网服务器,启动时仍然访问 huggingface.co,或者提示缺少 tokenizer、配置文件和 Python 包。这类失败往往发生在准备环节。离线部署需要同时准备模型仓库、可安装的依赖,以及与目标机器匹配的运行环境。
本文面向 Linux x86_64、Python 虚拟环境和 Transformers 文本生成模型。示例先用 CPU 验证文件及依赖闭环,再迁移到目标 GPU 环境。GPU 驱动、CUDA 与 PyTorch 构建的兼容性需要另外验收。
一、先固定目标环境,再准备下载
在目标服务器记录操作系统、CPU 架构、Python 小版本、glibc、GPU 和驱动版本。在相同系统镜像或等价构建机上准备依赖,能减少 wheel 不匹配的问题。Windows 上下载到的 Windows wheel 不能直接装到 Linux。
uname -m ldd --version python --version nvidia-smi
创建干净的准备环境,安装应用确实需要的包并完成一次在线加载,然后保存依赖版本。不要直接复制整个日常开发环境。下面两步在匹配目标平台的联网准备机上执行,requirements.lock.txt 应包含已验证的固定版本。
python -m pip freeze > requirements.lock.txt python -m pip download --only-binary=:all: \ -r requirements.lock.txt -d bundle/wheels
如果某个包没有匹配 wheel,此步骤会失败,应该在匹配的构建环境预先构建并测试 wheel。PyTorch 的 CPU/CUDA 版本和包来源也要固定,安装版本相同但构建不同仍可能失败。pip download 的跨平台参数适合明确掌握依赖标签的场景。
参考资料 · pip download 参数和平台约束
二、下载可独立迁移的模型目录
使用经过许可的模型仓库,将实际 commit SHA 写入交付记录。下面通过环境变量传入仓库和固定提交,下载目录可直接作为后续加载路径。保留配置、分词器、特殊 token、权重及其索引。多模态或自定义模型还可能需要额外处理器和本地代码,需逐项审查。
import os
from huggingface_hub import snapshot_download
snapshot_download(
repo_id=os.environ["MODEL_REPO"],
revision=os.environ["MODEL_COMMIT"],
local_dir="bundle/model",
)
避免只复制 Hub 缓存中的 snapshots 子目录。它可能引用 blobs 中的文件,迁移时要保留引用目标,或在打包时解引用为普通文件。检查实际文件大小,防止把 Git LFS 指针文本当成模型权重。另存仓库名、提交 SHA、许可、Python 版本、依赖锁文件和硬件说明,交付包中不包含访问令牌。
参考资料 · Hugging Face 仓库下载与本地目录
三、在目标机完成无索引安装
python -m venv .venv source .venv/bin/activate python -m pip install --no-index --find-links=bundle/wheels \ -r requirements.lock.txt python -m pip check
依赖冲突在准备机处理后重新生成交付包。检查运行用户对模型目录有读权限,对缓存、临时目录有必要的写权限。推理输出和日志放到单独目录,模型目录可以保持只读。
四、从本地路径加载,并验证离线行为
在导入相关库之前设置 HF_HUB_OFFLINE,加载时传入本地绝对路径和 local_files_only。对于标准支持的架构,保持 trust_remote_code=False,并要求 Safetensors 权重。下面是核心加载过程。
import os
os.environ["HF_HUB_OFFLINE"] = "1"
from transformers import AutoTokenizer, AutoModelForCausalLM
path = "/opt/models/my-model"
tokenizer = AutoTokenizer.from_pretrained(path, local_files_only=True)
model = AutoModelForCausalLM.from_pretrained(
path, local_files_only=True,
trust_remote_code=False, use_safetensors=True,
)
参考资料 · Transformers 离线加载
配套 offline_smoke.py 还阻止当前 Python 进程的常见 socket 连接,并执行四个新 token 的 CPU 生成。这能暴露部分隐式联网调用。生产验收仍要在实际禁止外联的网络环境运行整个服务,观察 DNS、连接尝试和启动日志,因为原生扩展或其他进程可能绕过 Python 级拦截。
五、按错误回到对应层排查
| 现象 | 先检查什么 |
|---|---|
| 缺 config.json 或 tokenizer 文件 | 路径是否正确,交付包是否含完整配置及分词器文件 |
| No matching distribution | Python ABI、平台、CPU 架构与 wheel 标签 |
| 启动访问 Hub | 是否传了仓库 ID、环境变量设置时机、额外插件的数据下载 |
| CUDA 初始化或算子加载失败 | 驱动与 PyTorch 构建,应用所需扩展是否预编译 |
| Safetensors 分片缺失 | 索引引用文件、文件大小及可信摘要 |
文件检查可直接使用本站的Safetensors 分片、索引与完整性校验教程。离线验收还应记录启动耗时、生成结果、包清单和目标环境,便于下一次版本更新复现。
验证范围:本篇配套脚本在本地随机初始化的微型 GPT-2 模型和分词器上执行,检查从本地目录加载及短文本生成。该实验不代表真实大模型、GPU、跨平台依赖交付均已通过验证。
配套文件与同系列文章
下载本文 Python 示例 ZIP。技术文档核对日期为 2026 年 11 月 10 日。
汤不热吧