问题背景
需要在联网电脑上为 llama-factory 项目创建虚拟环境并下载全部依赖,然后将该环境完整迁移到一台无法联网的离线电脑上运行。同时涉及跨系统(centos 7 ubuntu)迁移的兼容性处理,以及内网 pip 源的搭建方案选型。
一、方案选型:conda-pack vs pip 离线包
1.1 conda-pack 方案(同系统推荐)
核心思路:联网机装好环境 → conda-pack 打包成离线压缩包 → 离线机解压 + conda-unpack 修复路径。
前提条件:两台机器必须满足:
- 操作系统类型一致(都是 linux,或都是 windows)
- cpu 架构一致(都是 x86_64)
- python 大版本一致
离线机如需 gpu 训练,需本地安装匹配的 nvidia 驱动(驱动不能随环境迁移)。
联网机操作:
# 创建环境 conda create -n llama-factory python=3.10 -y conda activate llama-factory # 克隆项目并安装依赖 git clone https://github.com/hiyouga/llamafactory.git cd llamafactory pip install -e . # 验证依赖完整性 python -c "import torch; print(torch.__version__)" llamafactory-cli version # 打包环境(建议在 base 环境执行) conda activate base conda install -c conda-forge conda-pack -y conda pack -n llama-factory -o llama-factory.tar.gz
离线机操作:
# 解压到 conda envs 目录 mkdir -p ~/miniconda3/envs/llama-factory tar -xzf llama-factory.tar.gz -c ~/miniconda3/envs/llama-factory # 激活并修复路径(关键步骤,不可省略) conda activate llama-factory conda-unpack # 验证 python -c "import torch; print(torch.__version__)" llamafactory-cli version
1.2 pip 离线 wheel 包方案(跨系统推荐)
联网机下载:
cd llamafactory mkdir wheels # 按 requirements.txt 下载 pip download -r requirements.txt -d wheels # 下载当前项目依赖 pip download -e . -d wheels # 若 -e . 报错,改用:pip download . -d wheels
离线机安装:
conda create -n llama-factory python=3.10 -y conda activate llama-factory pip install --no-index --find-links=wheels -e .
注意:下载 wheel 的联网机和离线机的操作系统、cpu 架构、python 版本必须一致,否则平台标签不匹配会导致安装失败。
二、跨系统迁移:centos 7 ubuntu 的 glibc 陷阱
centos 7 的 glibc 版本为 2.17,ubuntu 22.04/24.04 分别为 2.35/2.39。glibc 只能向下兼容,不能向上兼容——在 ubuntu 上编译的二进制包放到 centos 7 上会报 version 'glibc_2.xx' not found。
2.1 各方案兼容性对比
| 方案 | centos 7 ubuntu | 原因 |
|---|---|---|
| conda-pack | 不可行 | 打包含解释器和 .so,跨发行版 glibc 不兼容 |
| pip wheel 离线包 | ️ 看情况 | 纯 python 包无问题;带 c 扩展的包需平台标签 ≤ 目标机 glibc 能力 |
| conda yaml 导出重建 | 可行(需联网) | 目标机重新下载构建,绕开二进制兼容问题 |
2.2 以 centos 7 为底线下载兼容 wheel
如果离线机是 centos 7(glibc 2.17,最受限),联网机下载时强制指定 manylinux2014 标签:
pip download -r requirements.txt -d wheels \ --platform manylinux2014_x86_64 \ --python-version 310 \ --abi cp310 \ --only-binary=:all:
manylinux2014 对应 glibc 2.17,可通吃 centos 7 和所有更高版本的 linux 发行版。若离线机是 ubuntu 且 glibc ≥ 2.28,可放宽到 manylinux_2_28。
2.3 最稳妥的离线方案
- 联网机导出依赖清单:
pip freeze > requirements.txt - 在离线机本机装好 conda/python,用同一份
requirements.txt从本地 wheel 目录安装:
pip install --no-index --find-links=/path/to/wheels -r requirements.txt
三、内网 pip 源搭建方案对比
| 方案 | 部署难度 | 需外网 | 存储占用 | 私有包上传 | 适用场景 |
|---|---|---|---|---|---|
| pypiserver | 否 | 取决于包数 | 需 twine | 简单离线分发 | |
| devpi | 否 | 同上 | 原生支持 | 长期团队使用 | |
| nginx 反向代理 | 是 | 0 | 不支持 | 有跳板机时 | |
| nexus pro | 否 | 同上 | 原生支持 | 已有 pro 授权 | |
| nexus oss | — | — | — | 不支持 pypi |
nexus repository oss(开源免费版)不支持 pypi 仓库类型,只有 pro 版支持。如果用的是 oss 版,建议改用 devpi 或 pypiserver。
四、pypiserver 完整部署(含 systemd 自启)
4.1 离线机准备
# 安装 pypiserver(需提前把 pypiserver 的 wheel 拷过来) pip install --no-index --find-links=/path/to/wheels pypiserver passlib # 创建专用运行用户 sudo useradd -r -s /sbin/nologin -d /data/packages pypi # 设置目录权限 sudo chown -r pypi:pypi /data/packages sudo chmod -r 755 /data/packages
4.2 生成 htpasswd 认证文件
sudo htpasswd -c /etc/pypiserver/htpasswd pypiuser
# 若无 htpasswd 命令,用 python 生成:
python -c "from passlib.apache import htpasswdfile; hf = htpasswdfile('/etc/pypiserver/htpasswd', new=true); hf.set_password('pypiuser', '你的密码'); hf.save()"
sudo chown pypi:pypi /etc/pypiserver/htpasswd
sudo chmod 640 /etc/pypiserver/htpasswd
4.3 systemd 服务文件
创建 /etc/systemd/system/pypiserver.service:
[unit]
description=pypi server (offline package repository)
after=network.target
[service]
type=simple
user=pypi
group=pypi
execstart=/usr/local/bin/pypi-server run \
-p 8080 \
-p /etc/pypiserver/htpasswd \
-a /etc/pypiserver/htpasswd \
--verbose \
/data/packages
restart=on-failure
restartsec=5
nonewprivileges=true
protectsystem=strict
protecthome=true
readwritepaths=/data/packages
[install]
wantedby=multi-user.target
若不需要认证(纯内网隔离),将 -p 和 -a 改为 -p . 和 -a .。
4.4 启动服务
sudo systemctl daemon-reload sudo systemctl start pypiserver sudo systemctl enable pypiserver sudo systemctl status pypiserver sudo journalctl -u pypiserver -f # 查看日志
4.5 客户端配置
# 无认证版 pip config set global.index-url http://<server_ip>:8080/simple pip config set global.trusted-host <server_ip> # 认证版 pip config set global.index-url http://pypiuser:密码@<server_ip>:8080/simple pip config set global.trusted-host <server_ip>
验证:
pip install requests --dry-run
4.6 防火墙放行
# centos 7 sudo firewall-cmd --permanent --add-port=8080/tcp sudo firewall-cmd --reload # ubuntu sudo ufw allow 8080/tcp
4.7 后续维护:添加新包
方式 a:直接拷文件(立即可用,无需重启)
cp new-package-1.0.0-cp310-manylinux2014_x86_64.whl /data/packages/
方式 b:通过 twine 上传
pip install twine twine upload --repository-url http://<server_ip>:8080/ -u pypiuser -p 密码 dist/*.whl
五、完整流程总结
联网机(同系统或指定 manylinux2014)
├── conda create → pip install -e . → 验证
├── 方案a: conda pack -o llama-factory.tar.gz
└── 方案b: pip download -r requirements.txt -d wheels
↓ 拷贝压缩包或 wheels 目录
离线机
├── 方案a: 解压 → conda activate → conda-unpack → 验证
└── 方案b: conda create → pip install --no-index --find-links=wheels -e .
↓ 若需长期维护
内网 pip 源
├── pypiserver + systemd 自启
├── 客户端 pip.conf 配置 index-url
└── 后续直接 pip install 即可
一句话:同系统用 conda-pack 最省事;跨系统用 pip wheel + manylinux2014 标签保底;长期维护搭 pypiserver 做内网源,一次部署永久可用。
以上就是离线迁移python环境的几种方案(从llama-factory依赖迁移到内网pip源搭建)的详细内容,更多关于离线迁移python环境的资料请关注代码网其它相关文章!
发表评论