当前位置: 首页 > news >正文

手把手教你用算能云空间搭建RISC-V版PyTorch环境(含最新CPUINFO补丁)

手把手教你用算能云空间搭建RISC-V版PyTorch环境(含最新CPUINFO补丁)

在AI技术快速发展的今天,RISC-V架构因其开源、可定制的特性,正逐渐成为边缘计算和云计算领域的新宠。然而,当工程师们尝试在这一架构上部署主流AI框架时,往往会遇到各种兼容性问题。本文将带你一步步在算能云空间上,为RISC-V架构搭建完整的PyTorch环境,包括解决最棘手的CPUINFO补丁问题。

1. 环境准备与基础配置

算能云空间为开发者提供了便捷的RISC-V开发环境,但在开始之前,我们需要完成一些基础配置工作。不同于x86架构的"开箱即用",RISC-V平台需要更多手动配置步骤。

首先登录算能云空间控制台,创建一个新的RISC-V实例。建议选择至少16GB内存的配置,因为后续的编译过程非常消耗资源。实例创建完成后,通过SSH连接到服务器,我们开始环境准备。

基础软件包安装

apt update && apt upgrade -y apt install -y python3 python-is-python3 python3-pip git pip install pyyaml

注意:如果在安装过程中遇到"Could not get lock"错误,可以使用ps aux | grep apt查找占用进程,然后用kill -9 [PID]终止该进程后重试。

开发工具链的安装是后续工作的基础,RISC-V平台需要特别注意BLAS库的兼容性:

软件包作用安装命令
libblas-dev基础BLAS实现apt install libblas-dev
m4宏处理器apt install m4
cmake构建工具apt install cmake
cython3Python扩展apt install cython3
ccache编译缓存apt install ccache

如果libopenblas-dev无法正常安装,可以手动编译OpenBLAS:

git clone https://github.com/xianyi/OpenBLAS.git cd OpenBLAS make -j$(nproc) make PREFIX=/usr/local/OpenBLAS install echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/OpenBLAS/lib/' >> /etc/profile source /etc/profile

2. 获取与修改PyTorch源码

PyTorch官方仓库并不直接支持RISC-V架构,因此我们需要获取源码并进行必要的修改。这一过程需要特别注意子模块的完整性。

mkdir -p ~/pytorch_riscv && cd ~/pytorch_riscv git clone --recursive https://github.com/pytorch/pytorch.git cd pytorch git submodule sync git submodule update --init --recursive

接下来是关键的源码修改环节,这些修改主要是为了绕过RISC-V架构不支持的编译选项:

  1. 修改aten/src/ATen/CMakeLists.txt: 将if(NOT MSVC AND NOT EMSCRIPTEN AND NOT INTERN_BUILD_MOBILE)替换为if(FALSE)

  2. 修改caffe2/CMakeLists.txt: 将target_link_libraries(${test_name}_${CPU_CAPABILITY} c10 sleef gtest_main)替换为target_link_libraries(${test_name}_${CPU_CAPABILITY} c10 gtest_main)

  3. 修改test/cpp/api/CMakeLists.txt: 在add_executable(test_api ${TORCH_API_TEST_SOURCES})后添加:

    target_compile_options(test_api PUBLIC -Wno-nonnull)

提示:使用vim编辑这些文件时,可以先用/搜索目标语句,确认无误后再用shift+i进入编辑模式,修改完成后按ESC退出编辑,输入:wq保存退出。

3. 环境变量配置与编译

正确的环境变量设置可以避免大量不必要的编译错误。在开始编译前,设置以下变量:

export USE_CUDA=0 export USE_DISTRIBUTED=0 export USE_MKLDNN=0 export MAX_JOBS=$(nproc)

现在可以开始编译了,这个过程可能需要几个小时,取决于服务器的性能:

python3 setup.py develop --cmake

编译过程中可能会遇到几个常见问题:

问题1:Could not find any of CMakeLists.txt in /root/xxx/pytorch/third_party/pthreadpool

解决方法

cd pytorch/third_party rm -rf pthreadpool cd ../.. git submodule update --init --recursive

问题2:undefined reference to `__atomic_exchange_1'

解决方法

apt install patchelf patchelf --add-needed libatomic.so.1 build/lib/libtorch_cpu.so

4. 解决CPUINFO兼容性问题

编译完成后,尝试导入torch时可能会遇到最棘手的问题:"Error in cpuinfo: processor architecture is not supported in cpuinfo"。这是因为官方cpuinfo仓库尚未完全支持RISC-V架构。

解决方法是用算能修改过的版本替换原cpuinfo:

cd third_party rm -rf cpuinfo git clone https://github.com/sophgo/cpuinfo.git cd ../.. python3 setup.py develop --cmake

这个补丁专门为RISC-V架构进行了适配,解决了处理器信息识别的核心问题。重新编译后,应该可以正常导入torch模块了。

5. 验证环境与简单模型测试

为了验证环境是否正常工作,我们可以创建一个简单的全连接神经网络测试脚本:

import torch import torch.nn as nn # 检查PyTorch版本和基本功能 print(f"PyTorch版本: {torch.__version__}") print(f"是否支持CUDA: {torch.cuda.is_available()}") # 在RISC-V上应为False print(f"随机张量测试: {torch.rand(3,3)}") # 定义一个简单的全连接网络 class SimpleNet(nn.Module): def __init__(self): super(SimpleNet, self).__init__() self.fc1 = nn.Linear(1000, 100) self.fc2 = nn.Linear(100, 10) def forward(self, x): x = torch.relu(self.fc1(x)) x = self.fc2(x) return x # 测试模型 model = SimpleNet() input = torch.randn(64, 1000) output = model(input) print(f"模型输出形状: {output.shape}")

将上述代码保存为test.py,然后运行:

python3 test.py

如果一切正常,你应该能看到PyTorch版本信息和一个形状为[64,10]的输出张量。这表明你的RISC-V版PyTorch环境已经成功搭建完成。

在实际项目中,你可能还需要考虑以下优化:

  • 使用export OMP_NUM_THREADS=[核心数]来控制线程数量
  • 定期清理编译缓存以节省空间:ccache -C
  • 考虑使用更轻量级的BLAS实现,如BLIS
http://www.jsqmd.com/news/505185/

相关文章:

  • Python DXF处理库架构深度解析:企业级CAD数据处理最佳实践
  • 从电影片段到动作识别:如何用TensorFlow/Keras搭建你的第一个3D CNN视频分类模型
  • YOLOv8实战:5分钟搞定Docker部署(含CUDA加速配置)
  • 别再只用rc.local了!Debian 11/12系统服务开机自启的三种正确姿势(附systemd实战)
  • 基于STM32的智能空气净化器设计与实现(完整项目)
  • Few-shot学习实战:5个技巧让BERT在少量数据上快速微调
  • 探索未来编程的新纪元:Kind——纯函数式编程语言与证明助手
  • C盘空间持续告急?试试Windows Cleaner的智能清理方案
  • 【猫抓cat-catch】:媒体资源智能捕获的全方位技术解析与实战指南
  • 深入Android音频驱动层:AAudio的MMAP_NOIRQ模式是如何实现超低延迟的?
  • MSG文件查看工具:跨平台邮件解析与处理的技术实现与应用指南
  • 从信号到数据:基于NI-DAQ与LabVIEW的光电倍增管(PMT)高速采集系统搭建实战
  • 轻量化特征重构 | 一种基于强弱特征分离与转换的轻量级网络设计 | 技术解析
  • Spring Boot 面试核心笔记
  • spaCy社区与生态:探索丰富的扩展插件和工具集合
  • 掌握大数据领域Kafka的消息分区策略
  • 零基础5分钟上手「时空波动仪」:IBM Granite FlowState时间序列预测实战教程
  • 告别连接难题:Windows 11环境下Multisim主数据库稳定运行全攻略
  • Obsidian PDF++插件:如何打造你的专属护眼PDF阅读环境
  • 手把手教你用Arduino驱动串口屏:从接线到显示‘Hello World’的完整教程
  • 为什么92%的Dify部署在生产环境未启用Judge沙箱?——深度解析动态评分链路中的6类未授权推理逃逸风险
  • Windows Server 2022上Docker部署Dify避坑指南:从Hyper-V配置到镜像加速全流程
  • 别再乱接线了!手把手教你搞定HDMI/DP/Type-C接口的硬件检测电路(附原理图分析)
  • 视频内容结构化提取:自动化PPT提取工具的专业解决方案
  • 【嵌入式C代码质量生死线】:20年老兵亲测的5大静态分析工具选型铁律,错过再等三年!
  • 解锁游戏语言魔盒:XUnity.AutoTranslator让你的Unity游戏开口说中文
  • 你还在用免费版?嵌入式C静态分析工具的3个隐藏成本陷阱(License/误报调试工时/CI集成失败率实测曝光)
  • 别再只配CorsRegistry了!Spring Security和拦截器下的CORS问题一站式解决指南
  • Simplicity Studio 5最新版安装指南:从SDK下载到工程创建全流程(附Gecko SDK配置技巧)
  • weixin240基于微信小程序的校园综合服务平台ssm(文档+源码)_kaic