【龙芯系统loongarch64安装python3.10+torch+torchvision+yolov8】

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本


最近需要配置龙芯板子,踩坑无数,总结如下。
配置环境的时候我发现很多直接pip是不符合龙芯架构的,即使换了pip源,也会有很多没有或者安装后不符合龙芯架构的,以及很多找的龙芯镜像里的wheel包是不能使用的,很多都是需要源码编译安装的,有很多需要注意的事项,特此记录。

编译安装python3.10

在github上下载适配loongarch64架构的的Cpython,网址链接:适配loongarch64的Cpython链接
然后我下载的是v3.10.2的tar.gz,你们也可以根据需要的版本进行下载。但要注意后续安装的其他软件的版本兼容性

特别提醒:不要自己在Cpython官网下载Cpython3.10然后直接编译安装,还需要替换可以识别Loongarch64架构的config.sub和config.guess文件以及修改configure文件等操作,比较麻烦,不然后续安装torch是怎么也成功不了的,既然githib上面有轮子,那就直接下载轮子好了,无需自己在造船了

接下来:

tar -xzvf cpython-3.10.2.tar.gz
cd cpython-3.10.2
./configure --prefix=你的安装目录(如:/data/app/python3.10.2) --enable-optimizations --with-ensurepip=install
make -j $(nproc)
sudo make altinstall
#创建虚拟环境,且不污染系统python
/data/app/python3.10.2/bin/python3.10 -m venv yolov8env
#激活虚拟环境并验证python版本
source yolov8env/bin/activate
python --version

补充:退出虚拟环境为deactivate,不过暂时不需要退出

编译安装cmake

由于后续软件版本不适配系统自带的cmake版本,故而先编译安装更高版本的cmake,我安装的是v3.28.0
以下为我整体环境配置的版本:

Torch 2.1.0
torchvision0.16.0
Python 3.10
Ultralytics 8.1.0
cmake 3.28.0
gcc 8.3.0
matplotlib 3.10.7
opencv-python 4.10.0.84
Scipy 
Pandas 2.0.3
numpy 1.26.4

安装配置cmake v3.28.0以下操作均在虚拟环境下运行

wget https://github.com/Kitware/CMake/releases/download/v3.28.0/cmake-3.28.0.tar.gz
tar -xzvf cmake-3.28.0.tar.gz
cd cmake-3.28.0
./bootstrap --prefix=你准备安装cmake的目录
make -j1   # 单线程,避免内存不足
sudo make install
#临时添加环境变量,先测试是否安装好
export PATH=你cmake的安装地址(如/data/app/cmake3.28.0)/bin:$PATH
cmake --version
#永久添加
vi ~/yolov8env/bin/activate
#将下面语句填进去
export PATH=你cmake的安装地址(如/data/app/cmake3.28.0)/bin:$PATH

添加示例:
VIRTUAL_ENV="/root/yolov8env"
export VIRTUAL_ENV

OLD_VIRTUAL_PATH="$PATH"
PATH="$VIRTUAL_ENV/bin:$PATH"
export PATH

# --- 在这里加入 cmake 路径 ---
export PATH="/usr/local/app/cmake3.30.5/bin:$PATH"
# ---------------------------------

编译安装numpy

由于pytorch依赖于numpy,于是先将numpy安装好。我在龙芯镜像网站下的numpy的wheel包我这里pip install 之后import测试总是出各种问题,应当是wheel包损坏,或者有什么不适配的地方,最后还是选择源码编译安装了。

安装 wheel之后出现的问题是这样的(不感兴趣可以跳过这段往下看,不影响后续安装配置):尽管我的测试目录不在numpy源码目录下,它依然报错ImportError: Error importing numpy: you should not try to import numpy from its source directory; please exit the numpy source tree, and relaunch,而且重新清理并pip install之后也未能解决。后来看问题代码处,发现是python找到的是源码形式的_C,而不是二进制编译好的C扩展。python C扩展(比如pytorch的_C或者pillow的一些模块),本质上来讲就是编译成.so或者.pyd的共享库。python import的时候会去查找_C模块对应的.so文件,然后通过Cpython ABI调用里面的函数。经过寻找发现numpy的wheel包里面有.so文件,并且也能链接到_C动态库依赖,那为什么报错呢?我发现在numpy文件夹下虽然有_C的.so文件,但是竟然还存在个文件夹目录名叫_C,估计程序检测的时候先检测到它,并误以为.so文件在这个文件夹里。但是并没有找到,所以代码处显示python找到的是源码形式的_C,而不是二进制编译好的C扩展,以及误以为是在源码目录下了,因此报错。感觉正常的wheel包应该不会出现这种情况,要没是wheel包本身损坏,要么是有什么和我的环境是不适配的,最终选择了源码编译

注意:以下操作为在虚拟环境中操作,避免污染系统环境,就想直接装在系统除外

pip install cython==0.29.36
sudo apt update
sudo apt install -y gcc g++ gfortran libopenblas-dev
sudo apt install build-essential gfortran \
libssl-dev zlib1g-dev libbz2-dev liblzma-dev \
libsqlite3-dev libreadline-dev tk-dev uuid-dev \
python3-dev

##接下来去github下载官方压缩包
wget numpy的tar.gz包对应的链接地址(我下载的是v1.26.4)
解压缩后 cd进去
python setup.py build
python setup.py install

测试代码:python -c"import numpy;print(numpy.__version__);"

注意:1.测试numpy一定要退出numpy源码目录再测试!!
2.倘若报错出问题了,并且问题比较奇怪,建议清除再重装试试

pip uninstall -y numpy
rm -rf ~/yolov8env/lib/python3.10/site-packages/numpy*

编译安装pytorch

安装cpu版本的torch2.1.0,以下均在虚拟环境中进行

sudo apt-get update
sudo apt-get install -y \
    build-essential \
    cmake \
    ninja-build \
    python3-dev \
    python3-pip \
    libopenblas-dev \
    libomp-dev \
    libprotobuf-dev \
    protobuf-compiler \
    git
sudo apt-get install libsleef-dev

pip install --upgrade pip setuptools wheel
#如若龙芯系统git很慢,可以参考最下面的注
git clone --branch v2.1.0 https://github.com/pytorch/pytorch.git
cd pytorch
git submodule update --init --recursive
#以下参数设置仅对当前窗口有效,如果关闭了当前命令行再安装需要重新输入,后续export同理,不再提示
export USE_CUDA=0
export USE_MKLDNN=0
export USE_NNPACK=0
export USE_QNNPACK=0
export USE_XNNPACK=0
export USE_DISTRIBUTED=0
export USE_KINETO=0
export BUILD_CAFFE2=0
export USE_SYSTEM_SLEEF=1
export USE_SYSTEM_PROTOBUF=1
export USE_ROCM=0
export USE_MPS=0
export CFLAGS="-fPIC "
export CXXFLAGS="-fPIC "
export PROTOBUF_PROTOC_EXECUTABLE=/usr/bin/protoc
#MAX_JOBS设置为1是由于pytorch编译真的需很大很大的内存,我的这个8g内存直接爆炸了,但是j1编译真的很慢,大概要4-5个小时,或者我觉得可以增加一下交换区的空间来解决这个问题
export MAX_JOBS=1

#若是要c++,如果不用c++版本的千万别执行哦
cmake --build . --target install -- -j1

#若是要python版本的:(大部分应该都是这个)
python setup.py develop
#若是编译百分百完成,但安装依赖出了问题:不用清除其他,继续执行下面这条命令
pip install -e . --no-build-isolation

#然后就是测试一下torch安装好了没
#torch测试代码:
import torch

print("PyTorch version:", torch.__version__)

# 1. 测试 CPU tensor
try:
    x = torch.rand(3, 3)
    y = torch.rand(3, 3)
    z = x + y
    print("CPU tensor test passed.")
    print("x + y =\n", z)
except Exception as e:
    print("CPU tensor test failed:", e)

# 2. 测试 C++ backend
try:
    a = torch.zeros(5, dtype=torch.float32)
    a += 1
    print("C++ backend test passed. Tensor a =", a)
except Exception as e:
    print("C++ backend test failed:", e)

# 3. 测试 CUDA(如果有 GPU,Loongson 默认没有)
print("CUDA available:", torch.cuda.is_available())

注:如若龙芯系统git很慢,可以先在windows系统进行克隆,然后再压缩打包传给龙芯系统(scp命令,有可能需要改变龙芯系统的IP地址,一般默认为Dhcp分配的动态地址,而非静态地址,详情可看另一篇博客)

#在win下
git clone --branch v2.1.0 https://github.com/pytorch/pytorch.git
cd pytorch
git submodule update --init --recursive
cd ..
tar -czvf pytorch pytorch2.1.0.tar.gz

再到win命令行scp给龙芯系统就好了

scp pytorch2.1.0.tar.gz root@remote_host:~/tars/
在这个命令中:

pytorch2.1.0.tar.gz 是本地文件的文件地址。
root@remote_host 是远程主机的用户名和地址ip。
~/tars/ 是远程主机上的目标路径。

编译安装torchvision

1.去github下载官方包: wget torchvision 0.16.0的tar.gz包链接地址
2.解压并cd vision0.16.0
3.export BUILD_CAFFE2=0
export BUILD_TEST=0
export USE_CUDA=0   
export CMAKE_ARGS="-DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$(python -c 'import sys; print(sys.prefix)')"
4.pip install . --no-deps --no-build-isolation

编译安装ultralytics

有很多的wheel包不能使用,但是ultralytics的wheel包还是可以使用的,去这个网址找你想要的wheel包版本:网址链接。我选用的是v8.1.0
注意要用none-any命名的或者loongarch64命名wheel包哦,wheel包本来就有很多用不了的,如果选错命名就更不能用啦,至于2_28还是2_38取决于你龙芯系统的glibc版本,命名2_28就要求glibc>=2.28,2_38就要求glibc>=2.38,如果你glibc是2.28是用不了2.38的wheel包的,一定要注意哦

接下来可以直接pip install 刚才的wheel包了,如果遇到什么依赖卡住特别久(大概5分钟朝上一直转),很可能最后也是报错,不如暂停先安装卡住的依赖项,下面是我在安装过程中卡住的一些依赖项,可以作个参考。

A 依赖matplotlib
1.wget matplotlib-3.10.7的tar.gz链接地址(github上找)      
2.pip install setuptools setuptools_scm setuptools_scm[toml] wheel cython meson meson-python  pybind11
3.pip install . --no-build-isolation --no-deps
#有问题再尝试4 5
4.qhull相关问题:
wget https://github.com/qhull/qhull/archive/v8.0.2/qhull-8.0.2.tar.gz
tar -xzvf qhull-8.0.2.tar.gz
mv qhull-8.0.2 matplotlib-3.10.7/extern/qhull-8.0.2
5.export MPLLOCALFREETYPE=0 

#B C的wheel包可用,直接pip install就可
B 依赖 opencv-python-4.10.0.84 
wget https://pypi.loongnix.cn/loongson/pypi/+f/026/6d86e92bbeed1/opencv_python-4.10.0.84-cp310-cp310-linux_loongarch64.whl#sha256=0266d86e92bbeed1ca23d1d6d4a9461bc14095bb9d309cd22cd4172e1c678738
C 依赖scipy 1.10.1
wget https://pypi.loongnix.cn/loongson/pypi/+f/cf7/28b09c2153e8f/SciPy-1.10.1-cp310-cp310-linux_loongarch64.whl#sha256=cf728b09c2153e8f40ddc7a736befe6f6f931b46e67640302f19578bd93dbd96


D 依赖pandas-2.0.3 
wget 压缩包
解压后
pip install versioneer
pip install . --no-build-isolation 

再剩下缺啥补啥吧
先看下面这个网址里有没有wheel包,没有或者用不了就去源码编译吧
链接

相关依赖补全ultralytics也就pip install成功了,接下来就是测试代码了,如果运行出错可看代码下面注处。

以yolov8为例,测试代码(记得加一个test.jpg作为检测的照片):
from ultralytics import YOLO
import cv2
import numpy as np

# 1. 加载 YOLOv8 模型(仅 CPU)
model = YOLO("yolov8n.pt")  # 可以换成更小的 yolov8n.pt
model.to("cpu")  # 强制使用 CPU

# 2. 读取测试图片
image_path = "test.jpg"
image = cv2.imread(image_path)
if image is None:
    raise FileNotFoundError(f"无法读取图片: {image_path}")

# 可选:缩小图片,加快推理并减少内存占用
scale = 0.5  # 缩放为原来的50%
image_small = cv2.resize(image, (0, 0), fx=scale, fy=scale)

# 3. 推理
results = model.predict(image_small, imgsz=640, device="cpu", conf=0.25, verbose=False)

# 4. 可视化结果
for result in results:
    boxes = result.boxes.xyxy.cpu().numpy()  # 检测框
    scores = result.boxes.conf.cpu().numpy()  # 置信度
    classes = result.boxes.cls.cpu().numpy()  # 类别

    for box, score, cls in zip(boxes, scores, classes):
        x1, y1, x2, y2 = map(int, box / scale)  # 恢复到原图大小
        label = f"{int(cls)}:{score:.2f}"
        cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 2)
        cv2.putText(image, label, (x1, y1-5),
                    cv2.FONT_HERSHEY_SIMPLEX, 0.4, (0, 255, 0), 1)

# 5. 保存结果
cv2.imwrite("result_cpu.jpg", image)
print("CPU推理完成,结果保存在 result_cpu.jpg")

注:更改cpuinfo代码,寻找替换处直接 /get_cpu_info

vi /root/yolov8env/lib/python3.10/site-packages/ultralytics/utils/torch_utils.py
#把原本的def get_cpu_info()代码替换成下面代码:
def get_cpu_info():
    try:
        import cpuinfo
        return cpuinfo.get_cpu_info().get("brand_raw", "Unknown CPU")
    except Exception:
        # LoongArch / unsupported CPU architectures will come here
        return "Generic CPU"

这样改好之后,虽然最后仍提示cpuinfo问题但是不影响yolov8的检测

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值