解決方案:昇騰aarch64服務器安裝CUDA+GCC+CMake,編譯安裝Pytorch,華為昇騰HPC服務器深度學習環境安裝全流程

目錄

  • 一、安裝CUDA和cudnn
    • 1.1、下載CUDA驅動
    • 1.2、安裝CUDA驅動
    • 1.3、配置環境變量
    • 1.4、安裝cudnn
    • 1.5、安裝magma-cuda
  • 二、安裝gcc編譯器
  • 三、安裝CMake
  • 四、安裝NCCL
  • 五、編譯安裝Pytorch
    • 5.1、前提準備
    • 5.2、下載pytorch源碼
    • 5.3、配置環境變量
    • 5.4、Pytorch編譯安裝
    • 5.5、測試Pytorch
  • 特別鳴謝以下博客

最近拿到一臺昇騰aarch64服務器,顯卡為A100,非常難得,但是與平常配置環境不同,服務器存在三大難題:

  1. 由于安全控制,服務器本身不能訪問外網;
  2. 服務器本身為ARM架構(aarch64),網上所有鏡像源的ARM版本Pytorch安裝包均為CPU版,無法使用CUDA;
  3. 沒有管理員權限,只拿到非Root用戶;

在經過了6*12+小時的不斷實踐、試錯、排錯、詢問大佬、尋找解決方案、重頭來過等等過程后,總結了一套在昇騰aarch64服務器編譯安裝支持GPU的Pytorch的解決方案,記錄在此。

編譯安裝Pytorch需要極高的耐心和較強的動手能力,在動手之前,你還需要具備以下條件

  1. 熟練操作一種ssh工具,如MobaXtem,能夠通過ssh連接服務器,能讀懂Linux系統基本終端命令;
  2. 登錄的服務器節點具備顯卡;
  3. 具備訪問某些網站的能力;
  4. 一顆勇敢的心。

一、安裝CUDA和cudnn

1.1、下載CUDA驅動

1.首先查看系統的cuda驅動,可以看到這里是12.3版本,所以我們要下載比其低的CUDA,推薦11.8版本。
在這里插入圖片描述
然后輸出nvcc --verison,如果是command not found說明沒有CUDA驅需要安裝,如果輸出了一大堆型號信息且版本低于上圖的CUDA 驅動版本,說明有CUDA且版本正確,就不要再安裝了,跳到#二步驟。

2.進入CUDA官網,根據系統版本選擇對應的runfile,注意因為是非root用戶,不要用sudo的rpm安裝,只能選擇下載runfile用sh安裝,因為其他版本需要管理員權限才行,(如果不知道機器是什么版本,可以使用uname -m查看架構)

在這里插入圖片描述
可以使用wget下載:wget https://developer.download.nvidia.com/compute/cuda/11.8.0/local_installers/cuda_11.8.0_520.61.05_linux_sbsa.run
如果沒有外網環境用不了wget,使用本機下載這個.run文件后,然后傳到服務器,使用sh安裝。

1.2、安裝CUDA驅動

如果是非root用戶,終端cd進入下載好.run文件的目錄,使用sh安裝:sh cuda_11.8.0_520.61.05_linux_sbsa.run
首先會彈出問你接不接受一個協議,輸入accept:
在這里插入圖片描述
然后回彈出安裝配置:
在這里插入圖片描述
↑↓進行上下,←→進行擴展,enter進行選擇和取消,A進行擴展選項
我們取消掉Driver選項,因為機器已經安裝了Driver,只安裝CUDA Toolkit和CUDA documentation:
在這里插入圖片描述
然后選擇選中Options:
在這里插入圖片描述
進入Toolkit Options:
在這里插入圖片描述
/usr這種非用戶目錄的選項都要去掉,我這里全去掉了,另外進入 Change Toolkit Install Path設置cuda安裝到自己具有寫入權限的路徑(一定要是自己的目錄,提前建好文件夾,不然你安不了)
在這里插入圖片描述

做完Done,回到Options菜單, 更改Library install path (不改不行,它會偷偷寫入/var/lib)
在這里插入圖片描述
同樣設置安裝到自己具有寫入權限的路徑(同樣一定要是自己的目錄)
在這里插入圖片描述
配置好以上兩個自定義目錄后,選擇Done,等待片刻會出現一個summary,說明安裝成功:
在這里插入圖片描述
并且能在文件目錄中看到cuda里的文件都已經安裝好了:
在這里插入圖片描述

1.3、配置環境變量

安裝好后還不能使用nvcc --V,需要配置環境變量:
輸入 vim ~/.bashrc進入環境變量,進行更改:

# CUDA
export PATH="/剛剛的路徑/cuda-10.1/bin:$PATH"
export LD_LIBRARY_PATH="/剛剛的路徑/cuda-11.8/lib64:/剛剛的路徑/cuda-11.8/mylib/lib64:$LD_LIBRARY_PATH"

路徑要記得換成自己的:
在這里插入圖片描述
添加好后,輸入wq!保存,然后刷新環境變量:source ~/.profile

最后測試CUDA,輸入nvcc -V,如果顯示了版本號,則恭喜大獲成功:
在這里插入圖片描述

1.4、安裝cudnn

這里參考了:https://blog.csdn.net/YY007H/article/details/134772564

1.5、安裝magma-cuda

magma-cuda主要用于大規模線性代數計算和GPU加速。

首先進入anaconda官方網站:https://anaconda.org/search?q=magma,選擇自己對應CUDA版本的安裝包,如果是CUDA11.8就找magma-cuda118,后面的版本號就是對應的CUDA號:
在這里插入圖片描述
將其下載后,遷移到Anaconda安裝目錄的pkgs目錄下(因為注conda install 緩存文件路徑一般就是anaconda/pkgs),如果下載的包名是linux-64_開頭的,要重命名把linux-64_去除,以包名開頭,不然conda識別不到。然后使用終端cd到pkgs目錄那里,輸入:

conda install --use-local 包名.tar.bz2

等待片刻,安裝完成后輸入conda list就可以看到包名了,如果看不到包名的話大概率是包名的問題,比如linux-64_magma-cuda118-2.6.1-1.tar.bz2要改成magma-cuda118-2.6.1-1.tar.bz2。

二、安裝gcc編譯器

首先測試下機器有沒有gcc,輸入gcc -v,如果出現以下提示,說明有gcc,該版本為10.3.1,就不用再安裝了,但如果低于10版本則必須升級gcc版本。到#三。
在這里插入圖片描述
這里可以參考這兩篇博客安裝好相應環境:
https://zhuanlan.zhihu.com/p/659247505(推薦)
https://blog.csdn.net/qq_36393978/article/details/118678521

安裝gcc的時間極其漫長,make的時候一般要至少4個小時,我實測為6小時,所以得提前做好準備。

三、安裝CMake

在編譯安裝Pytorch之前,需要要有CMake編譯構建工具。

CMake是一個開源的跨平臺構建工具,用于管理軟件構建過程中的配置、編譯和安裝。它提供了一個簡潔的跨平臺語言(CMakeLists.txt)來描述構建過程的規則,并通過生成與目標開發環境兼容的構建文件(如Makefile 或 Visual Studio 解決方案)來完成實際的構建過程。

首先進入CMake官網:https://cmake.org/download/,找到符合系統架構的.tar.gz格式的安裝包:
在這里插入圖片描述
這里選擇了aarch64的3.27.9安裝包,并上傳到服務器進行解壓:

tar -zxvf cmake-3.27.9-linux-aarch64.tar.gz

解壓之后,將解壓后的目錄改名為CMake方便編寫環境變量。

最后一步,打開環境變量文件,如vim ~/.bashrc,在環境變量的最后加入一行即可:

export PATH=你的路徑/cmake/bin:$PATH

然后輸入cmake --version,如果出現版本號說明CMake安裝成功!

四、安裝NCCL

這里完全參考這篇博客:https://blog.csdn.net/Scenery0519/article/details/128081062

其最后一步的環境變量配置寫在~/.bashrc里面就行。

五、編譯安裝Pytorch

5.1、前提準備

在正式編譯安裝Pytorch前,你要確認已經弄好了以下配置:

  1. CUDA驅動和CUDA:使用nvidia-smi和nvcc -V均有值,并且已經安裝并配置了CUDNN; 在這里插入圖片描述
    2.具備10版本以上的gcc編譯環境:使用gcc -v查看
    在這里插入圖片描述
    3.安裝了Anaconda或者Miniconda:輸入conda env list可以看到已有的虛擬環境;
    4.安裝好了cmake,即輸入cmake --version可以看到cmake的版本號

5.2、下載pytorch源碼

源碼編譯安裝pytorch前,需要下載完整的pytorch源碼:https://github.com/pytorch/pytorch/tree/v1.10.2-rc1

首先使用git clone --recursive https://github.com/pytorch/pytorch開始克隆源碼,如果碰到網絡問題需要設置git代理:

# git 代理設置,前提是你有代理
# git config --global http.proxy "localhost:端口號"
# git config --global https.proxy "localhost:端口號"
# 代理設置好,下載完后,就可以取消了,否則可能影響你其他操作
# 取消代理 
# git config --global --unset http.proxy 
# git config --global --unset https.proxy

如果沒有代理,可以通過以下方式進行下載:

# 如果網絡不行可以試著通過鏡像地址 或 gitee 克隆
# 如 git clone --recursive https://hub.yzuu.cf/pytorch/pytorch
# 如 git clone --recursive https://gitee.com/ascend/pytorch.git

在下載好pytorch源碼后,非常重要的一步就是必須遞歸下載其中的鏈接包,這里使用git submodule遞歸下載:

git submodule sync
git submodule update --init --recursive

安裝好后,你的pytorch包一般在2.5GB以上,如果文件大小過小,說明你有些遞歸的包沒下載完整。

5.3、配置環境變量

使用vim ~/.bashrc或者使用mobaXtem的文件樹方式打開環境變量文件,里面的內容配置如下:
在這里插入圖片描述

  • export USE_CUDA=1:用于設置一個名為 USE_CUDA 的環境變量,并將其值設置為 1。可能用于告知后續的腳本或程序,在構建過程中需要使用 CUDA 進行加速或其他相關操作。
  • export USE_SYSTEM_NCCL=ON:設置一個環境變量 USE_SYSTEM_NCCL 的值為 ON,表明使用系統中已安裝的 NCCL 庫。
  • CUDA 相關的環境變量:設置 CUDA 安裝路徑、相關 bin 和 lib 路徑,同時還指定了 CMake 所使用的 CUDA 編譯器和 CUDNN 庫的路徑。
  • CMAKE相關的環境變量:添加了 CMake 可執行文件的路徑到 PATH 環境變量中、設置 CMake 的前綴路徑,用于指定額外的 CMake 模塊和包的位置。
  • export MAX_JOBS=4:設置一個名為 MAX_JOBS 的環境變量,并將其值設置為 4,可能用于指定并行編譯任務的最大數量。這個按機器進行設置,太大了容易崩潰。
  • GCC相關的環境變量:包括gmp、mpc、mpfr、gcc以在運行時正確鏈接這些庫。

5.4、Pytorch編譯安裝

cd進入Pytorch目錄,采用直接安裝的方式進行安裝:

# 直接安裝
python setup.py install --cmake
# 或者 編譯成 whl安裝文件,編譯成功后在dist文件下面,可通過 pip install torch-xxxx.whl 安裝
python setup.py bdist_wheel --cmake

安裝過程大概在40分鐘到2小時不等:
在這里插入圖片描述

5.5、測試Pytorch

安裝完成后,激活虛擬環境,然后輸入python,然后輸入一下代碼:

import torch
print(torch.__version__)
print(torch.cuda.is_available())

如果顯示True即大功告成!

如果報錯:NameError: name ‘sympy’ is not defined‘,則需要在conda里再安裝sympy模塊,如果還是報錯,需要安裝mpmath,反正就import torch報啥錯就補上相關的環境就好。

最后可以再運行以下代碼查看顯卡數量和顯卡型號

print(torch.cuda.device_count())
print(torch.cuda.get_device_name(0))

就能看到torch成功調用到了A100啦!

特別鳴謝以下博客

安裝CUDA:
https://www.cnblogs.com/li-minghao/p/13089405.html

安裝CUDNN:
https://blog.csdn.net/YY007H/article/details/134772564

安裝gcc:
https://blog.csdn.net/qq_36393978/article/details/118678521
https://blog.csdn.net/qq_38308388/article/details/127574517

安裝nccl:https://blog.csdn.net/Scenery0519/article/details/128081062

安裝pytorch:
https://blog.csdn.net/CSDN_ten/article/details/132636688

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/24553.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/24553.shtml
英文地址,請注明出處:http://en.pswp.cn/web/24553.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python教程:Python操作MySQL基礎使用

8、Python操作MySQL基礎使用 8.1 安裝pymysql pip install pymysql8.2 測試連接 測試代碼 from pymysql import Connection# 獲取到MySQL數據庫的鏈接對象 conn Connection(# 主機名hostlocalhost,# 端口號,默認3306port3306,# 賬戶名userroot,# 密碼password3535 )# 打印…

日志分析集群最新版

日志分析集群-8版本 作者:行癲(盜版必究) 第一部分:Elasticsearch 一:環境準備 1.簡介 ? 部署模式:es集群采用無主模式 ? es版本:8.13.4 ? jdk版本:使用es內嵌的jdk21&#x…

GAT1399協議分析(10)--單圖像刪除

一、官方接口 由于批量刪除的接口,圖像只能單獨刪除。 二、wireshark實例 這個接口比較簡單,調用request delete即可 文本化: DELETE /VIID/Images/34078100001190001002012024060513561300065 HTTP/1.1 Host: 10.0.201.56:31400 User-Age…

【sklearn】【邏輯回歸1】

學習筆記來自: 所用的庫和版本大家參考: Python 3.7.1Scikit-learn 0.20.1 Numpy 1.15.4, Pandas 0.23.4, Matplotlib 3.0.2, SciPy 1.1.0 1 概述 1.1 名為“回歸”的分類器 在過去的四周中,我們接觸了不少帶“回歸”二字的算法&#xf…

生物神經網絡 原理分析研讀02

可能有用基礎介紹 人類交互1 大腦視覺的處理過程 人類交互2 聽覺處理和語言中樞 人類交互3 皮膚感覺與運動系統 人類交互4 感覺輸入和運動輸出 人類交互5 大腦信號編碼與解碼 相關材料分析研讀 當前為了實現人工智能的兩個主流技術是深度學習和類腦計算,深度學習…

linux防止nmap掃描

1、首先關閉Centos7自帶的firewalld [rootnode ~]# systemctl disable firewalld.service && systemctl stop firewalld.service 2、安裝iptables服務 [rootnode ~]# yum install iptables-services iptables-devel -y [rootnode ~]# systemctl enable iptables …

【Vue】練習-Vuex中的值和組件中的input雙向綁定

目標 實時輸入&#xff0c;實時更新&#xff0c;鞏固 mutations 傳參語法 實現步驟 代碼示例 App.vue <input :value"count" input"handleInput" type"text"> <script>export default {methods: {handleInput (e) {// 1. 實時獲取…

MyQL 事務隔離級別解析

隔離級別臟讀不可重復讀幻讀未提交讀可能可能可能已提交讀不可能可能可能可重復讀不可能不可能可能可串行化不可能不可能不可能 當我們談論數據庫事務的隔離級別時&#xff0c;經常會聽到“臟讀”、“不可重復讀”和“幻讀”這三個術語。下面我會盡量用通俗的語言來解釋它們&a…

分布式Shiro,SpringBoot項目Shiro整合Redis

分布式Shiro&#xff0c;SpringBoot項目Shiro整合Redis 重要 Begin 你的SpringBoot項目已經使用了Shiro&#xff0c;并且可以正常使用。本篇文章的主要目的是將Shiro保存在服務器內存中的session信息改為使用Redis保存session信息 重要 End 正文開始 0、前情概要 由于shiro…

Python通過數據驗證功能在Excel文件中創建下拉列表

Excel表格的靈活性和功能性深受各行各業人士的喜愛。在Excel表格中&#xff0c;下拉列表功能是提升數據錄入效率與準確性的一個重要利器&#xff0c;能夠為用戶提供預設的選擇項&#xff0c;限制輸入范圍&#xff0c;避免手動輸入錯誤&#xff0c;還能夠簡化數據錄入過程&#…

Rust : windows下protobuf嘗試

此前dbpystream庫是用python開發 web api。今天在rust中試用一下protobuf。 一、 protobuf編譯器下載 具體見相關文章。沒有編譯器&#xff0c;protobuf無法運行。 windows參見&#xff1a; https://blog.csdn.net/wowotuo/article/details/139458846?spm1001.2014.3001.550…

推薦系統三十六式學習筆記:原理篇.內容推薦05|從文本到用戶畫像有多遠?

目錄 從文本開始構建用戶畫像一、結構化文本1、TF-IDF2、TextRank3、內容分類&#xff1a;4、實體識別5、聚類6、詞嵌入 二、標簽選擇1、卡方檢驗2、信息增益 總結 對于一個早期的推薦系統來說&#xff0c;基于內容推薦離不開用戶構建一個初級的畫像&#xff0c;這種初級的畫像…

【數據結構】棧的應用

目錄 0 引言 1 棧在括號匹配中的應用 2 棧在表達式求值中的應用 2.1 算數表達式 2.2 中綴表達式轉后綴表達式 2.3 后綴表達式求值 3 棧在遞歸中的應用 3.1 棧在函數調用中的作用 3.2 棧在函數調用中的工作原理 4 總結 0 引言 棧&#xff08;Stack&#xff09;是一…

MySQL A表的字段值更新為B表的字段值

MySQL A表的字段值更新為B表的字段值 準備數據表 create table person (id int unsigned auto_increment comment 主鍵 primary key,uuid varchar(32) not null comment 系統唯一標識符32個長度的字符串,mobile varchar(11) null comment 中國國內手機號,nickn…

使用 Ollama 和 Open WebUI 自托管 LLM 聊天機器人(無需 GPU)

?點擊這里?&#xff1a;&#x1f680;原文鏈接&#xff1a;&#xff08;更好排版、視頻播放、社群交流、最新AI開源項目、AI工具分享都在這個公眾號&#xff01;&#xff09; 使用 Ollama 和 Open WebUI 自托管 LLM 聊天機器人&#xff08;無需 GPU&#xff09; &#x1f31…

二叉查找樹詳解

目錄 二叉查找樹的定義 二叉查找樹的基本操作 查找 插入 建立 刪除 二叉樹查找樹的性質 二叉查找樹的定義 二叉查找樹是一種特殊的二叉樹&#xff0c;又稱為排序二叉樹、二叉搜索樹、二叉排序樹。 二叉樹的遞歸定義如下&#xff1a; &#xff08;1&#xff09;要么二…

10. MySQL 用戶

文章目錄 【 1. 權限表 】1.1 user 權限表1.1.1 用戶列1.1.2 權限列1.1.3 安全列1.1.4 資源控制列 1.2 db 表用戶列權限列 1.3 tables_priv 表1.4 columns_priv 表1.5 procs_priv表 【 2. 用戶管理 】2.1 創建用戶 CREATE USER2.2 用戶的登陸、退出登陸 MySQL退出 MySQL 2.3 重…

Java常見錯誤-內部類-簡要分析

Java常見錯誤-內部類-簡要分析 概念分類成員內部類&#xff08;非靜態內部類&#xff09;靜態內部類成員內部類和靜態內部類區別 局部內部類匿名內部類 注意事項總結 概念 ? 內部類&#xff0c;顧名思義&#xff0c;就是在一個類的內部定義的類。這種設計允許將一個類的實現細…

深度學習-10-測試

深度學習-10-測試 本文是《深度學習入門2-自製框架》 的學習筆記&#xff0c;記錄自己學習心得&#xff0c;以及對重點知識的理解。如果內容對你有幫助&#xff0c;請支持正版&#xff0c;去購買正版書籍&#xff0c;支持正版書籍不僅是尊重作者的辛勤勞動&#xff0c;也是鼓勵…

Web前端ES6-ES13筆記合集(下)

#### 五.ES10新特性 ##### 1. Object.fromEntries > Object.fromEntries()方法允許你輕松地將鍵值對列表轉換為對象 js const arr [["name", "kerwin"], ["age", 100]]; console.log(Object.fromEntries(arr))//{name: kerwin, age: 100} …