在AI模型部署的实际工作中,我们经常遇到需要将训练好的模型从一台服务器迁移到另一台服务器的场景。特别是在医疗、金融等对数据安全要求严格的行业,内网环境往往无法直接联网下载模型和依赖,这就使得离线迁移成为必备技能。本文将以Qwen3-VL-8B模型为例,详细介绍如何从配备A6000显卡的服务器完整打包模型和环境,并成功部署到配备2080显卡的离线服务器上。
这个方案特别适合以下场景:
Conda环境打包是整个过程中最关键的一步,它确保了目标服务器能够拥有完全一致的Python运行环境。我们使用conda-pack工具来完成这个任务,相比直接复制env目录,它有以下几个优势:
具体操作步骤如下:
bash复制# 激活源环境
conda activate env_name
# 记录当前环境的所有包
conda list > packages.txt
# 安装conda-pack
pip install conda-pack
# 打包环境
conda pack -n env_name -o qwen3_env.tar.gz
注意:打包过程可能会持续几分钟,取决于环境大小。对于包含PyTorch等大型包的典型AI环境,生成的tar.gz文件通常在1-2GB左右。
模型文件通常体积较大,Qwen3-VL-8B模型大约需要15-20GB存储空间。我们需要确保完整打包以下几个部分:
bash复制# 定位模型目录(通常位于~/.cache/modelscope/hub/)
cd ~/.cache/modelscope/hub/models/Qwen/Qwen3-VL-8B-Instruct
# 打包整个模型目录
tar -czf qwen3_model.tar.gz .
除了环境和模型,还需要打包项目运行所需的所有代码和配置文件:
bash复制# 打包Python脚本、配置文件和测试数据
tar -czf project_files.tar.gz \
swift_infer_py.py \
test_data.jsonl \
README.md \
requirements.txt
在目标服务器上,我们需要先解压环境包。这里有几个关键点需要注意:
bash复制# 创建部署目录
mkdir -p /2080/qwen3_env
# 解压环境包
tar -xzf qwen3_env.tar.gz -C /2080/qwen3_env
# 激活环境
source /2080/qwen3_env/bin/activate
模型部署需要注意文件权限和路径一致性:
bash复制# 创建模型目录
mkdir -p /2080/qwen3_model
# 解压模型
tar -xzf qwen3_model.tar.gz -C /2080/qwen3_model
# 验证模型完整性
ls -lh /2080/qwen3_model
bash复制# 创建项目目录
mkdir -p /2080/qwen3_project
# 解压项目文件
tar -xzf project_files.tar.gz -C /2080/qwen3_project
# 修改模型路径
sed -i "s|old_model_path|/2080/qwen3_model|g" /2080/qwen3_project/swift_infer_py.py
bash复制# 检查Python路径
which python
# 检查Python版本
python --version
# 检查PyTorch版本和CUDA支持
python -c "import torch; print(f'PyTorch: {torch.__version__}'); print(f'CUDA available: {torch.cuda.is_available()}')"
bash复制# 进入项目目录
cd /2080/qwen3_project
# 测试模型加载
python -c "from transformers import AutoModelForCausalLM; model = AutoModelForCausalLM.from_pretrained('/2080/qwen3_model')"
bash复制# 运行推理脚本
python swift_infer_py.py
这是跨服务器部署最常见的问题。解决方案有:
bash复制# 离线安装特定版本的torch
pip install torch-2.9.0+cu121-cp310-cp310-linux_x86_64.whl
确保所有路径引用都已更新为目标服务器的实际路径。可以使用以下命令批量修改:
bash复制# 递归修改项目目录下所有文件的路径
find /2080/qwen3_project -type f -exec sed -i "s|/old/path|/2080/qwen3_model|g" {} +
尽管conda-pack已经打包了所有依赖,但有时仍会遇到缺失系统库的情况。常见解决方案:
bash复制# 检查缺失的依赖
ldd /2080/qwen3_env/bin/python
# 设置库路径
export LD_LIBRARY_PATH=/2080/qwen3_env/lib:$LD_LIBRARY_PATH
为了简化部署过程,可以创建一个自动化部署脚本:
bash复制#!/bin/bash
# 解压环境
mkdir -p /2080/qwen3_env
tar -xzf qwen3_env.tar.gz -C /2080/qwen3_env
# 解压模型
mkdir -p /2080/qwen3_model
tar -xzf qwen3_model.tar.gz -C /2080/qwen3_model
# 解压项目
mkdir -p /2080/qwen3_project
tar -xzf project_files.tar.gz -C /2080/qwen3_project
# 更新路径
sed -i "s|old_model_path|/2080/qwen3_model|g" /2080/qwen3_project/*.py
# 设置环境变量
echo "export PATH=/2080/qwen3_env/bin:\$PATH" >> ~/.bashrc
echo "export LD_LIBRARY_PATH=/2080/qwen3_env/lib:\$LD_LIBRARY_PATH" >> ~/.bashrc
source ~/.bashrc
为了减少打包文件大小,可以考虑:
bash复制# 清理缓存
conda clean -a
pip cache purge
# 移除未使用的包
pip install pip-autoremove
pip-autoremove -y package_name
建议在打包前记录所有关键组件的版本信息:
bash复制# 记录环境信息
conda list --export > conda_requirements.txt
pip freeze > pip_requirements.txt
# 记录系统信息
uname -a > system_info.txt
nvidia-smi > gpu_info.txt
在多次跨服务器部署Qwen模型的过程中,我总结了以下几点重要经验:
离线验证必不可少:在源服务器上断开网络,使用打包的环境和模型完整运行一次推理流程,这是发现潜在问题的最佳方式。
路径处理要谨慎:相对路径在跨服务器部署时常常引发问题,建议在代码中全部使用绝对路径,或者通过配置文件管理路径。
环境隔离很重要:即使使用conda-pack,也可能会遇到系统级依赖问题。在可能的情况下,尽量使用容器化技术(如Docker)实现更彻底的环境隔离。
文档记录要详细:记录下源服务器和目标服务器的所有关键配置信息,包括CUDA版本、驱动版本、系统库版本等,这对后续排查问题非常有帮助。
分批验证策略:先验证环境,再验证模型加载,最后测试完整推理流程。这种分步验证可以快速定位问题所在。
对于GPU型号不同的情况,如从A6000迁移到2080,还需要特别注意: