搭建LLaMA-Factory环境

一、下载LLaMA-Factory源代码

使用以下命令,下载源代码:

bash 复制代码
git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git

或者直接点击【LLaMA-Factory】下载源代码。

二、确定依赖的python版本

下载后进入LLaMA-Factory目录,查看README_zh.md文件,找到关键字"python",确定要安装的python版本,如下所示:

根据以上信息,我们这里需要安装python 3.10。

三、python 3.10环境准备与依赖安装

1.更新系统与开发工具

bash 复制代码
sudo yum update -y
sudo yum groupinstall "Development Tools" -y
sudo yum install -y zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel \
readline-devel tk-devel libffi-devel gdbm-devel db4-devel libpcap-devel xz-devel expat-devel

作用:安装编译 Python 所需的依赖库。若缺少依赖可能导致 _ctypes、_ssl 等模块编译失败

2.检查 OpenSSL 版本

bash 复制代码
openssl version

若版本低于 1.1.1,需手动升级(Python 3.10 要求 OpenSSL ≥1.1.1):

bash 复制代码
wget https://www.openssl.org/source/openssl-1.1.1k.tar.gz
tar -zxvf openssl-1.1.1k.tar.gz && cd openssl-1.1.1k
./config --prefix=/usr/local/openssl shared zlib
make && sudo make install
# 配置系统使用新版本
echo "/usr/local/openssl/lib" >> /etc/ld.so.conf
ldconfig -v
ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl

升级后重新验证 openssl version 是否显示新版本,例如:

四、编译安装 Python 3.10

1.下载源码并解压

执行以下命令进行下载解压

bash 复制代码
wget https://www.python.org/ftp/python/3.10.0/Python-3.10.0.tgz
tar -zxvf Python-3.10.0.tgz && cd Python-3.10.0

或者点击【Python-3.10.0】进行下载并解压。

2.配置编译参数

bash 复制代码
./configure --prefix=/usr/local/python3.10 --enable-optimizations --with-openssl=/usr/local/openssl --with-ssl-default-suites=openssl

关键参数说明:

  • --with-openssl:指定自定义 OpenSSL 路径(避免 SSL module 缺失)。
  • --enable-optimizations:优化编译性能,若编译失败可去掉此参数。

3.编译与安装

bash 复制代码
make -j $(nproc) && sudo make altinstall

使用 altinstall 而非 install:避免覆盖系统默认 Python 2.7。

4.验证安装

bash 复制代码
/usr/local/python3.10/bin/python3.10 --version  # 应输出 Python 3.10.x
/usr/local/python3.10/bin/python3.10 -c "import ssl; print(ssl.OPENSSL_VERSION)"  # 验证 SSL 模块

五、Python3.10环境配置

1.设置全局软链接

bash 复制代码
sudo ln -s /usr/local/python3.10/bin/python3.10 /usr/bin/python3
sudo ln -s /usr/local/python3.10/bin/pip3.10 /usr/bin/pip3

2.配置环境变量

bash 复制代码
echo 'export PATH=$PATH:/usr/local/python3.10/bin' >> /etc/profile
source /etc/profile

3.修复 yum 工具冲突

修改 /usr/bin/yum 和 /usr/libexec/urlgrabber-ext-down 文件,将 #!/usr/bin/python 改为 #!/usr/bin/python2,以解决因 Python 3 导致 yum 失效的问题。

六、python3.10安装常见错误及解决方法

1.zipimport.ZipImportError: can't decompress data; zlib not available

原因:缺少 zlib-devel 库。

解决:

bash 复制代码
sudo yum install -y zlib-devel
# 重新编译 Python

2.ModuleNotFoundError: No module named '_ctypes'

原因:未安装 libffi-devel。

解决:

bash 复制代码
sudo yum install -y libffi-devel
# 重新编译 Python

3.SSL module is not available 或 pip 证书验证失败

原因:Python 未正确链接 OpenSSL。

解决:确认编译时指定 --with-openssl 路径。

若仍报错,手动修改 Modules/Setup 文件,添加以下内容后重新编译:

bash 复制代码
SSL=/usr/local/openssl
_ssl _ssl.c -DUSE_SSL -I$(SSL)/include -L$(SSL)/lib -lssl -lcrypto

4.动态库缺失(如 libssl.so.1.1)

解决:

bash 复制代码
ln -s /usr/local/openssl/lib/libssl.so.1.1 /usr/lib64/libssl.so.1.1
ln -s /usr/local/openssl/lib/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1
ldconfig -v

5.make altinstall 后无 pip3

原因:altinstall 不会自动创建 pip 软链接。

解决:手动创建软链接或通过 python3 -m ensurepip 安装。

七、优化pip配置源

1.配置国内 pip 源

bash 复制代码
mkdir -p ~/.pip && cat > ~/.pip/pip.conf << EOF
[global]
index-url = https://mirrors.aliyun.com/pypi/simple/
trusted-host = mirrors.aliyun.com
EOF

2.更新 pip 与 setuptools

bash 复制代码
pip3 install --upgrade pip setuptools

CentOS 7.9 安装 Python 3.10 的核心在于 OpenSSL 升级和依赖完整性检查。若遇到编译错误,优先检查依赖库是否齐全,并通过环境变量和编译参数确保 Python 正确链接所需组件。

八、编译安装LLaMA-Factory

方法1:使用pip3直接安装

执行以下命令进行安装

bash 复制代码
cd LLaMA-Factory
pip3 install .

如果提示以下错误时:

bash 复制代码
ERROR: Exception:
Traceback (most recent call last):
  File "/usr/local/python3.10/lib/python3.10/site-packages/pip/_internal/cli/base_command.py", line 173, in _main
    status = self.run(options, args)
  File "/usr/local/python3.10/lib/python3.10/site-packages/pip/_internal/cli/req_command.py", line 203, in wrapper
    return func(self, options, args)
  File "/usr/local/python3.10/lib/python3.10/site-packages/pip/_internal/commands/install.py", line 266, in run
    session = self.get_default_session(options)
  File "/usr/local/python3.10/lib/python3.10/site-packages/pip/_internal/cli/req_command.py", line 74, in get_default_session
    self._session = self.enter_context(self._build_session(options))
  File "/usr/local/python3.10/lib/python3.10/site-packages/pip/_internal/cli/req_command.py", line 88, in _build_session
    session = PipSession(
  File "/usr/local/python3.10/lib/python3.10/site-packages/pip/_internal/network/session.py", line 289, in __init__
    self.headers["User-Agent"] = user_agent()
  File "/usr/local/python3.10/lib/python3.10/site-packages/pip/_internal/network/session.py", line 132, in user_agent
    linux_distribution = distro.linux_distribution()  # type: ignore
  File "/usr/local/python3.10/lib/python3.10/site-packages/pip/_vendor/distro.py", line 125, in linux_distribution
    return _distro.linux_distribution(full_distribution_name)
  File "/usr/local/python3.10/lib/python3.10/site-packages/pip/_vendor/distro.py", line 681, in linux_distribution
    self.version(),
  File "/usr/local/python3.10/lib/python3.10/site-packages/pip/_vendor/distro.py", line 741, in version
    self.lsb_release_attr('release'),
  File "/usr/local/python3.10/lib/python3.10/site-packages/pip/_vendor/distro.py", line 903, in lsb_release_attr
    return self._lsb_release_info.get(attribute, '')
  File "/usr/local/python3.10/lib/python3.10/site-packages/pip/_vendor/distro.py", line 556, in __get__
    ret = obj.__dict__[self._fname] = self._f(obj)
  File "/usr/local/python3.10/lib/python3.10/site-packages/pip/_vendor/distro.py", line 1014, in _lsb_release_info
    stdout = subprocess.check_output(cmd, stderr=devnull)
  File "/usr/local/python3.10/lib/python3.10/subprocess.py", line 420, in check_output
    return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
  File "/usr/local/python3.10/lib/python3.10/subprocess.py", line 524, in run
    raise CalledProcessError(retcode, process.args,
subprocess.CalledProcessError: Command '('lsb_release', '-a')' returned non-zero exit status 1.
Traceback (most recent call last):
  File "/usr/local/bin/pip3", line 8, in <module>
    sys.exit(main())
  File "/usr/local/python3.10/lib/python3.10/site-packages/pip/_internal/cli/main.py", line 70, in main
    return command.main(cmd_args)
  File "/usr/local/python3.10/lib/python3.10/site-packages/pip/_internal/cli/base_command.py", line 98, in main
    return self._main(args)
  File "/usr/local/python3.10/lib/python3.10/site-packages/pip/_internal/cli/base_command.py", line 214, in _main
    self.handle_pip_version_check(options)
  File "/usr/local/python3.10/lib/python3.10/site-packages/pip/_internal/cli/req_command.py", line 143, in handle_pip_version_check
    session = self._build_session(
  File "/usr/local/python3.10/lib/python3.10/site-packages/pip/_internal/cli/req_command.py", line 88, in _build_session
    session = PipSession(
  File "/usr/local/python3.10/lib/python3.10/site-packages/pip/_internal/network/session.py", line 289, in __init__
    self.headers["User-Agent"] = user_agent()
  File "/usr/local/python3.10/lib/python3.10/site-packages/pip/_internal/network/session.py", line 132, in user_agent
    linux_distribution = distro.linux_distribution()  # type: ignore
  File "/usr/local/python3.10/lib/python3.10/site-packages/pip/_vendor/distro.py", line 125, in linux_distribution
    return _distro.linux_distribution(full_distribution_name)
  File "/usr/local/python3.10/lib/python3.10/site-packages/pip/_vendor/distro.py", line 681, in linux_distribution
    self.version(),
  File "/usr/local/python3.10/lib/python3.10/site-packages/pip/_vendor/distro.py", line 741, in version
    self.lsb_release_attr('release'),
  File "/usr/local/python3.10/lib/python3.10/site-packages/pip/_vendor/distro.py", line 903, in lsb_release_attr
    return self._lsb_release_info.get(attribute, '')
  File "/usr/local/python3.10/lib/python3.10/site-packages/pip/_vendor/distro.py", line 556, in __get__
    ret = obj.__dict__[self._fname] = self._f(obj)
  File "/usr/local/python3.10/lib/python3.10/site-packages/pip/_vendor/distro.py", line 1014, in _lsb_release_info
    stdout = subprocess.check_output(cmd, stderr=devnull)
  File "/usr/local/python3.10/lib/python3.10/subprocess.py", line 420, in check_output
    return run(*popenargs, stdout=PIPE, timeout=timeout, check=True,
  File "/usr/local/python3.10/lib/python3.10/subprocess.py", line 524, in run
    raise CalledProcessError(retcode, process.args,
subprocess.CalledProcessError: Command '('lsb_release', '-a')' returned non-zero exit status 1.

需要确认python3是否能正确访问lsb_release.py文件,解决方法如下:

1.首先,确认执行以下命令确保已安装了lsb_release。

bash 复制代码
lsb_release -a

如果提示命令不存在,执行以下命令进行安装:

bash 复制代码
sudo apt-get update
sudo apt-get install lsb-release

如果需要先卸载,可以先执行以下命令:

bash 复制代码
sudo apt-get purge lsb-release
sudo apt-get autoremove

2.再次确认lsb_release是否已安装,如果提示下面这个错误:

bash 复制代码
# lsb_release -a
Traceback (most recent call last):
  File "/usr/bin/lsb_release", line 25, in <module>
    import lsb_release
ModuleNotFoundError: No module named 'lsb_release'

则需要确认python3的环境中是否能找到lsb_release.py文件。

3.确认lsb_release.py是否存在,可以使用以下命令搜索:

bash 复制代码
locate lsb_release.py

如果没有,则可以用以下代码创建一个:

python 复制代码
# 创建必要的目录和文件
sudo mkdir -p /usr/lib/python3/dist-packages/lsb_release.py

# 创建基本的 lsb_release 模块
sudo tee /usr/lib/python3/dist-packages/lsb_release.py > /dev/null << 'EOF'
#!/usr/bin/python3

def lsb_release():
    return {
        'id': 'Linux',
        'description': 'Generic Linux',
        'release': '0.0',
        'codename': 'n/a'
    }

if __name__ == "__main__":
    info = lsb_release()
    print("LSB Version:\tn/a")
    print("Distributor ID:\t{}".format(info['id']))
    print("Description:\t{}".format(info['description']))
    print("Release:\t{}".format(info['release']))
    print("Codename:\t{}".format(info['codename']))
EOF

4.使用以下命令,确认python3加载默认python文件的路径

bash 复制代码
python3 -c "import sys; print('\n'.join(sys.path))"

例如,返回以下目录:

这里,我们挑选其中的/usr/local/python3.10/lib/python3.10/site-packages目录作为lsb_release.py文件的存放目录即可。此时,如果其它目录有现成的lsb_release.py文件,则只需要用以下命令创建个软链接即可,例如:

bash 复制代码
ln -s /usr/share/pyshared/lsb_release.py /usr/local/python3.10/lib/python3.10/site-packages/lsb_release.py

如果没有现成的,则只需要把第3步自己创建的lsb_release.py文件链接到该目录下即可。

5.验证解决结果,如果能返回以下信息,则表示问题已解决。

bash 复制代码
root@da:/mnt/workspace# lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.5 LTS
Release:        22.04
Codename:       jammy
root@da:/mnt/workspace# 

方法2:使用uv快速安装

执行以下命令进行安装

bash 复制代码
cd LLaMA-Factory
uv  pip install . --system

等待一段时间后,将会看到并行下载线程和安装过程。

相关推荐
yuanpan8 分钟前
ubuntu系统上的conda虚拟环境导出方便下次安装
linux·ubuntu·conda
麻辣清汤27 分钟前
结合BI多维度异常分析(日期-> 商家/渠道->日期(商家/渠道))
数据库·python·sql·finebi
云边云科技31 分钟前
零售行业新店网络零接触部署场景下,如何选择SDWAN
运维·服务器·网络·人工智能·安全·边缘计算·零售
钢铁男儿37 分钟前
Python 正则表达式(正则表达式和Python 语言)
python·mysql·正则表达式
城管不管43 分钟前
Docker核心---数据卷(堵门秘籍)
运维·docker·容器
钢铁男儿1 小时前
Python 正则表达式实战:解析系统登录与进程信息
开发语言·python·正则表达式
AOwhisky1 小时前
Linux 文本处理三剑客:awk、grep、sed 完全指南
linux·运维·服务器·网络·云计算·运维开发
大千AI助手1 小时前
GitHub Copilot:AI编程助手的架构演进与真实世界影响
人工智能·深度学习·大模型·github·copilot·ai编程·codex
前端小趴菜051 小时前
python - range
python
☺����1 小时前
实现自己的AI视频监控系统-第一章-视频拉流与解码1
人工智能·python·音视频