离线迁移Python环境的两种方案(从LLaMA-Factory依赖迁移到内网pip源搭建)

 更新时间:2026年09月30日 08:53:05   作者:学亮编程手记  
想要把LLaMA-Factory项目环境迁移到无法联网的电脑上,本文详细对比conda-pack和pip离线wheel包两种方案,重点解决跨系统迁移时常见的GLIBC版本不兼容问题,并手把手教你用pypiserver搭建内网pip源,实现一次部署永久可用,需要的朋友可以参考下

问题背景

需要在联网电脑上为 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 最稳妥的离线方案

  1. 联网机导出依赖清单:pip freeze > requirements.txt
  2. 在离线机本机装好 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环境的资料请关注脚本之家其它相关文章!

相关文章

  • python UIAutomator2使用超详细教程

    python UIAutomator2使用超详细教程

    这篇文章主要介绍了python UIAutomator2使用超详细教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-02-02
  • 简述Python中的进程、线程、协程

    简述Python中的进程、线程、协程

    这篇文章主要介绍了Python中的进程、线程、协程的相关资料,需要的朋友可以参考下
    2016-03-03
  • FFT快速傅里叶变换的python实现过程解析

    FFT快速傅里叶变换的python实现过程解析

    这篇文章主要介绍了FFT快速傅里叶变换的python实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • python 绘制国旗的示例

    python 绘制国旗的示例

    这篇文章主要介绍了python 绘制国旗的示例,帮助大家利用python绘制,处理图像,感兴趣的朋友可以了解下
    2020-09-09
  • Python绘制土地利用和土地覆盖类型图示例详解

    Python绘制土地利用和土地覆盖类型图示例详解

    本文介绍了如何使用Python绘制土地利用和土地覆盖类型图,并提供了详细的代码示例,通过安装所需的库,准备地理数据,使用geopandas和matplotlib等库,可以绘制出土地利用和覆盖类型图,感兴趣的朋友一起看看吧
    2025-01-01
  • Python用SSH连接到网络设备

    Python用SSH连接到网络设备

    这篇文章主要介绍了Python用SSH连接到网络设备,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下
    2021-02-02
  • python下调用pytesseract识别某网站验证码的实现方法

    python下调用pytesseract识别某网站验证码的实现方法

    下面小编就为大家带来一篇python下调用pytesseract识别某网站验证码的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • Python操作JSON实现网络数据交换

    Python操作JSON实现网络数据交换

    这篇文章主要介绍了Python操作JSON实现网络数据交换,JSON的全称是 JavaScript Object Notation,是一种轻量级的数据交换格式,关于JSON的更多相关内容感兴趣的小伙伴可以参考一下
    2022-06-06
  • Python中requests做接口测试的方法

    Python中requests做接口测试的方法

    Requests是一个很实用的Python HTTP客户端库,编写爬虫和测试服务器响应数据时经常会用到,本文主要介绍了Python中requests做接口测试的方法,感兴趣的可以了解一下
    2021-05-05
  • python实现人机猜拳小游戏

    python实现人机猜拳小游戏

    这篇文章主要为大家详细介绍了python实现人机猜拳小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02

最新评论