境nvcc not found?CUDA 11.6編譯鏈配置與排查指南)
去年底幫同事在Windows上配深度學(xué)習(xí)環(huán)境遇到一個(gè)特別經(jīng)典也特別容易讓人懵的報(bào)錯(cuò)新建好一個(gè)conda環(huán)境之后在終端里敲nvcc -V系統(tǒng)直接甩回來一句nvcc 不是內(nèi)部或外部命令也不是可運(yùn)行的程序或批處理文件。當(dāng)時(shí)環(huán)境里PyTorch都裝好了GPU訓(xùn)練也能正常跑起來唯獨(dú)想編譯一個(gè)自定義CUDA算子時(shí)找不到編譯器。排查了一下午才發(fā)現(xiàn)這本質(zhì)上不是“conda壞了”或者“安裝包丟了”而是很多人在概念上把CUDA運(yùn)行時(shí)、顯卡驅(qū)動(dòng)、CUDA Toolkit這三者混成了一回事。這篇文章就把完整的排查過程、兩種可落地的解決方案以及后續(xù)各種“換環(huán)境就翻車”的坑點(diǎn)都整理出來特別是針對(duì)CUDA 11.6這一代的工具鏈按Windows和Linux兩條線都覆蓋一遍希望幫你少走幾趟彎路。1. nvcc“憑空消失”的背后conda里到底裝了什么東西1.1 先復(fù)現(xiàn)這個(gè)報(bào)錯(cuò)你遇到的是哪一種形態(tài)先說現(xiàn)象。同樣是conda環(huán)境下找不到11.6版本的nvcc在不同平臺(tái)上報(bào)錯(cuò)形態(tài)完全不一樣Windows上常見的提示是nvcc 不是內(nèi)部或外部命令也不是可運(yùn)行的程序或批處理文件。或者是PowerShell里的nvcc : 無法將“nvcc”項(xiàng)識(shí)別為 cmdlet、函數(shù)、腳本文件或可運(yùn)行程序的名稱。Linux和macOS上最常見的就是bash: nvcc: command not found這兩種提示本質(zhì)上是一回事系統(tǒng)沿著PATH環(huán)境變量找了一圈都沒有找到名為nvcc的可執(zhí)行文件。但還有一個(gè)很容易被混淆的“假性not found”——命令能找到卻報(bào)版本不一致nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2021 NVIDIA Corporation Built on Thu_Jan_28_19:32:54_PST_2021 Cuda compilation tools, release 11.2, V11.2.152如果你在conda環(huán)境里敲nvcc -V看到的是11.2而不是11.6這通常意味著你調(diào)用的不是你conda環(huán)境里應(yīng)該有的那個(gè)nvcc而是系統(tǒng)級(jí)的其它CUDA Toolkit。這種問題比單純的not found更隱蔽后面我會(huì)單獨(dú)講。1.2 CUDA不是“裝個(gè)驅(qū)動(dòng)就完事”驅(qū)動(dòng)、運(yùn)行時(shí)和編譯器是三套東西這是整篇文章最核心的概念必須先掰扯清楚。一臺(tái)機(jī)器要跑CUDA程序需要三樣?xùn)|西協(xié)同工作顯卡驅(qū)動(dòng)NVIDIA Driver負(fù)責(zé)操作系統(tǒng)層和GPU硬件之間的通信是基礎(chǔ)中的基礎(chǔ)。它決定你的機(jī)器最高能用哪個(gè)CUDA版本。CUDA運(yùn)行時(shí)CUDA Runtime / cudatoolkit一系列動(dòng)態(tài)鏈接庫比如cudart.dll、cublas.dll、curand.dll等。PyTorch、TensorFlow 這些框架在跑GPU算子時(shí)底層調(diào)用的就是這些庫。conda里的cudatoolkit包主要提供的就是這一層。CUDA Toolkit編譯器工具鏈這才是給開發(fā)人員用的東西包含nvcc編譯器、cuobjdump、nvprof等工具以及include頭文件、靜態(tài)庫、樣例代碼等。換句話說conda環(huán)境里能跑GPU訓(xùn)練的PyTorch只能證明運(yùn)行時(shí)庫在正常工作不代表編譯器也裝好了。這就像一個(gè)廚房里煤氣灶、鍋碗瓢盆都是好的但你就是沒有菜刀來了食材也切不了。我見過太多人在conda里執(zhí)行conda install cudatoolkit11.6然后天真地以為nvcc也一并裝好了。實(shí)際上官方channel里的cudatoolkit包是一個(gè)“運(yùn)行時(shí)精簡版”它刻意去掉了編譯器只保留跑程序必需的動(dòng)態(tài)庫文件。這是conda團(tuán)隊(duì)為了讓PyTorch等框架體積更小、依賴更簡單而做的設(shè)計(jì)。想要nvcc需要的是另一個(gè)包。1.3 conda里的cudatoolkit做了減法帶編譯器的包另有其人在conda的生態(tài)里與CUDA相關(guān)的包有好幾個(gè)名字很像但內(nèi)容差異非常大包名包含nvcc編譯器包含運(yùn)行時(shí)庫主要用途cudatoolkit否是給Python框架提供CUDA Runtimecudatoolkit-dev是是編譯CUDA代碼/二次編譯算子cuda-toolkit是是NVIDIA新的conda包結(jié)構(gòu)按組件拆分cuda-nvcc是僅編譯組件否NVIDIA新的獨(dú)立編譯組件包如果你在conda環(huán)境里遇到11.6版本的nvcc not found十有八九是因?yàn)橹谎b了cudatoolkit沒有裝cudatoolkit-dev或者用了太老的打包方式。搞清楚這個(gè)之后排查思路就清晰了。2. 按這個(gè)順序排查三步定位問題到底出在哪一層2.1 第一步確認(rèn)顯卡驅(qū)動(dòng)本身沒問題看nvidia-smi不要跳過這一步很多看起來像是“nvcc沒裝好”的問題其實(shí)根源是驅(qū)動(dòng)版本太低或者驅(qū)動(dòng)壓根沒裝上。在終端里執(zhí)行nvidia-smiWindows用戶注意如果你用的是CMD直接輸入命令即可如果你是PowerShell同樣直接輸入??吹筋愃葡旅娴妮敵鼍驼f明驅(qū)動(dòng)層是好的----------------------------------------------------------------------------- | NVIDIA-SMI 515.65.01 Driver Version: 515.65.01 CUDA Version: 11.7 | -----------------------------------------------------------------------------重點(diǎn)看右邊的CUDA Version它表示當(dāng)前驅(qū)動(dòng)最高支持到哪個(gè)CUDA版本。如果這個(gè)數(shù)字小于11.6說明你的顯卡驅(qū)動(dòng)太老即使后面把nvcc裝上了編譯出來的程序也可能跑不起來報(bào)CUDA driver version is insufficient for CUDA runtime version。如果nvidia-smi提示找不到比如nvidia-smi 不是內(nèi)部或外部命令那問題就不在conda里而是NVIDIA驅(qū)動(dòng)沒裝上或者環(huán)境變量沒配好。這種情況先去NVIDIA官網(wǎng)更新驅(qū)動(dòng)再回來繼續(xù)排查。2.2 第二步檢查當(dāng)前conda環(huán)境里裝了什么CUDA相關(guān)包問題很可能出在安裝包的版本和類型上。激活出問題的conda環(huán)境比如你叫它c(diǎn)uda116執(zhí)行conda list | findstr cuda # Windows conda list | grep cuda # Linux/macOS重點(diǎn)看兩個(gè)信息有沒有cudatoolkit或者cuda-toolkit這一行版本號(hào)是不是11.6.x。如果你的輸出里只有類似cudatoolkit11.6.0而沒有cudatoolkit-dev那就可以下結(jié)論當(dāng)前環(huán)境里根本沒有編譯器只有運(yùn)行時(shí)。這就是nvcc not found的直接原因之一。還有一種情況是conda list里完全沒有任何CUDA相關(guān)條目。這意味著你只是在系統(tǒng)層面裝了某種CUDA但當(dāng)前conda環(huán)境是完全隔離的它不知道也不關(guān)心系統(tǒng)里有什么。conda環(huán)境的PATH機(jī)制會(huì)優(yōu)先使用環(huán)境自己的目錄所以即便你系統(tǒng)里裝了CUDA 11.6在這個(gè)環(huán)境里敲nvcc也可能找不到——因?yàn)閏onda activate之后環(huán)境的bin目錄排在系統(tǒng)路徑前面但環(huán)境里又沒有編譯器于是反饋not found。2.3 第三步查PATH和可執(zhí)行文件判斷是沒裝還是路徑污染在確認(rèn)有沒有裝、裝了什么之后就看執(zhí)行時(shí)的搜索路徑。Windows下用where nvccLinux/macOS下用which nvcc如果沒有任何輸出那就是PATH里根本沒有包含nvcc所在目錄。這時(shí)再執(zhí)行echo %PATH% # Windows CMD echo $env:PATH # PowerShell echo $PATH # Linux/macOS注意看conda環(huán)境的路徑是否排在前面Windows下形如C:\Users\你的用戶名\miniconda3\envs\cuda116\Library\binLinux下形如/home/用戶名/miniconda3/envs/cuda116/bin。如果where nvcc輸出了一個(gè)路徑但版本不是你想要的11.6那就是路徑污染了——系統(tǒng)找到了另一個(gè)CUDA版本下的nvcc而conda環(huán)境本身沒安裝或者沒排在搜索優(yōu)先級(jí)前面。這種情況很常見你在conda環(huán)境里執(zhí)行nvcc時(shí)命中了系統(tǒng)級(jí)C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.2\bin下的舊工具。這類問題我會(huì)在第五節(jié)詳細(xì)展開。3. 方案一在conda環(huán)境內(nèi)裝上帶編譯器的版本激活即用3.1 用cudatoolkit-dev包補(bǔ)齊CUDA 11.6編譯鏈如果你的需求是“在這個(gè)conda環(huán)境里能直接敲nvcc編譯cu文件”最推薦的方式是直接在環(huán)境里安裝帶編譯器的包。在激活目標(biāo)環(huán)境后執(zhí)行conda activate cuda116 conda install cudatoolkit-dev11.6.0 -c conda-forge這里有幾個(gè)關(guān)鍵細(xì)節(jié)值得展開說。第一為什么要指定-c conda-forge因?yàn)楣俜絚hannel里的cudatoolkit-dev包覆蓋不完全conda-forge上面對(duì)CUDA 11.6.x的編譯鏈支持更好。conda-forge是社區(qū)維護(hù)的channel包版本全、更新快對(duì)開發(fā)工具的覆蓋尤其完整。第二cudatoolkit-dev11.6.0這個(gè)版本號(hào)寫的是包本身的版本不是分支或標(biāo)簽。在執(zhí)行安裝之前推薦先搜索一下可用的版本號(hào)避免寫錯(cuò)導(dǎo)致PackagesNotFoundErrorconda search cudatoolkit-dev -c conda-forge輸出里會(huì)列出所有可用版本比如11.6.0、11.6.1、11.6.2選擇其中一個(gè)和你現(xiàn)有cudatoolkit一致的即可。第三如果你用的是新版conda4.13以上可能更習(xí)慣用NVIDIA官方維護(hù)的新包結(jié)構(gòu)。NVIDIA從CUDA 12開始逐步把conda包拆成了小粒度組件比如cuda-nvcc、cuda-cudart、cuda-cccl等并且也提供叫cuda-toolkit的總包。但注意這套新包結(jié)構(gòu)對(duì)11.6這種老版本支持不夠好大部分新組件包只覆蓋11.8以上版本。所以對(duì)于CUDA 11.6老老實(shí)實(shí)用cudatoolkit-dev是最穩(wěn)的。3.2 安裝后驗(yàn)證確認(rèn)nvcc真的在這個(gè)環(huán)境里裝完之后我習(xí)慣按下面的順序做一次完整驗(yàn)證conda list | findstr cudatoolkit # 確認(rèn)包里內(nèi)容 where nvcc # Windows看它在哪個(gè)目錄 nvcc -V # 看版本號(hào)是否為11.6Windows下cudatoolkit-dev安裝后會(huì)把nvcc.exe放到envs\cuda116\Library\bin\目錄下where nvcc應(yīng)該顯示這個(gè)完整路徑。Linux下則是在envs/cuda116/bin/nvcc??吹筋愃葡旅娴妮敵鼍驼f明編譯器已經(jīng)準(zhǔn)備就緒nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2021 NVIDIA Corporation Built on Wed_May_19_17:37:07_PST_2021 Cuda compilation tools, release 11.6, V11.6.124提示如果你已經(jīng)有一個(gè)運(yùn)行中的conda環(huán)境而我這里說的是新建一個(gè)干凈的cuda116環(huán)境那建議先從conda create -n cuda116 python3.10開始把環(huán)境和項(xiàng)目依賴解耦避免多個(gè)環(huán)境之間出現(xiàn)包版本打架。3.3 為什么conda裝nvcc比官方安裝包更適合某些場景方案一最大的優(yōu)勢在于權(quán)限和環(huán)境隔離。很多公司服務(wù)器、學(xué)校集群不會(huì)給你管理員權(quán)限官方安裝包需要往系統(tǒng)目錄如/usr/local/cuda-11.6寫文件沒有root根本裝不了。conda裝到用戶目錄下不需要提權(quán)。項(xiàng)目之間CUDA版本經(jīng)常不一致一個(gè)項(xiàng)目用11.6另一個(gè)項(xiàng)目用11.8共用一套系統(tǒng)編譯工具很可能互相干擾。conda環(huán)境天然隔離每個(gè)環(huán)境綁定的庫和編譯器互不干擾。我實(shí)際經(jīng)歷過一個(gè)場景同一個(gè)服務(wù)器上有三個(gè)conda環(huán)境分別用CUDA 11.2、11.6、11.8跑不同版本的PyTorch。如果在系統(tǒng)層面統(tǒng)一裝一個(gè)Toolkit會(huì)很痛苦——每次切換項(xiàng)目都要去改PATH、改LD_LIBRARY_PATH而且還容易漏。用conda裝完之后激活哪個(gè)環(huán)境就用哪個(gè)環(huán)境的工具鏈干凈利落。4. 方案二完整CUDA Toolkit安裝程序加環(huán)境轉(zhuǎn)發(fā)腳本4.1 什么時(shí)候必須走官方安裝包這條路conda的cudatoolkit-dev雖然方便但有些場景它撐不住你需要用到nvprof、ncuNsight Compute、cuobjdump這些調(diào)試和性能分析工具而cudatoolkit-dev里通常沒有。你需要把CUDA 11.6的頭文件和靜態(tài)庫鏈接到自己的C/C工程里做本地編譯conda的include目錄在Windows上跨編譯器調(diào)用會(huì)有一些路徑兼容問題。你需要做CUDA交叉編譯、生成不同架構(gòu)的可執(zhí)行文件conda的包對(duì)這種多target支持不完整。某些奇怪的老版本依賴conda-forge上已經(jīng)撤包了搜不到cudatoolkit-dev11.6.0只能去NVIDIA官網(wǎng)下載離線安裝包。這種時(shí)候就用方案二去NVIDIA官網(wǎng)下載CUDA Toolkit 11.6安裝程序安裝到系統(tǒng)級(jí)目錄。4.2 安裝時(shí)的組件取舍以及為什么不要?jiǎng)尤諴ATH下載地址是NVIDIA官網(wǎng)的CUDA Toolkit Archive里面能找到11.6.x的全系列版本。Windows下安裝時(shí)有幾個(gè)選擇要注意選擇“自定義安裝”不要“精簡安裝”。不要勾選“Display Driver”CUDA Toolkit安裝包自帶的驅(qū)動(dòng)通常比當(dāng)前機(jī)器上運(yùn)行的驅(qū)動(dòng)舊尤其你機(jī)器驅(qū)動(dòng)已經(jīng)是515或更高讓它覆蓋安裝驅(qū)動(dòng)等于主動(dòng)降級(jí)。不要勾選“Visual Studio Integration”除非你確信用Visual Studio做CUDA開發(fā)否則這是個(gè)大坑——它會(huì)篡改VS的項(xiàng)目模板卸載時(shí)還可能破壞VS配置。只保留CUDA Runtime、CUDA Development、CUDA Documentation這些編譯開發(fā)必用的組件即可。安裝完成后默認(rèn)路徑是Windows下的C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.6\或者Linux下的/usr/local/cuda-11.6/nvcc就在下面的bin目錄里。這時(shí)候大多數(shù)人的第一反應(yīng)是“把bin目錄加到PATH”。我非常不建議你直接改系統(tǒng)全局PATH尤其是你日常主力開發(fā)都用conda。原因很簡單全局PATH一旦加上系統(tǒng)級(jí)CUDA 11.6可能你所有conda環(huán)境在編譯時(shí)都優(yōu)先找到系統(tǒng)nvcc導(dǎo)致環(huán)境內(nèi)部包版本和編譯器版本不一致各種“session鏈接到錯(cuò)誤libcudart”的問題。更好的方式是做一個(gè)“環(huán)境轉(zhuǎn)發(fā)腳本”只在目標(biāo)conda環(huán)境內(nèi)生效。4.3 用封裝腳本綁定conda環(huán)境而不是污染全局路徑以Windows為例。假設(shè)官方安裝完nvcc路徑是C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.6\bin\nvcc.exe而你希望cuda116這個(gè)conda環(huán)境里敲nvcc能用它但又不污染全局PATH。我推薦做一個(gè)轉(zhuǎn)發(fā)腳本第一步找到conda環(huán)境的bin目錄Windows下是C:\Users\你的用戶名\miniconda3\envs\cuda116\Library\bin\。第二步在里面新建一個(gè)nvcc.bat文件內(nèi)容就一行echo off C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.6\bin\nvcc.exe %*Linux的寫法類似在envs/cuda116/bin/nvcc下寫一個(gè)bash腳本#!/bin/bash exec /usr/local/cuda-11.6/bin/nvcc $記得chmod x。第三步激活cuda116環(huán)境執(zhí)行nvcc -V驗(yàn)證。這個(gè)方案的精妙之處在于只有在這個(gè)conda環(huán)境里nvcc才會(huì)被解析成系統(tǒng)CUDA 11.6其它環(huán)境完全不受影響運(yùn)行時(shí)庫的加載順序也不會(huì)被全局PATH打亂。如果你的項(xiàng)目還需要頭文件和庫文件注意在編譯時(shí)加上-I和-L參數(shù)指向系統(tǒng)Toolkit目錄或者給conda環(huán)境設(shè)一對(duì)局部環(huán)境變量。Windows下可以在envs\cuda116\etc\conda\activate.d\env_vars.bat里寫set CUDA_PATHC:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.6 set CUDA_HOMEC:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.6Linux下對(duì)應(yīng)寫envs/cuda116/etc/conda/activate.d/env_vars.shexport CUDA_PATH/usr/local/cuda-11.6 export CUDA_HOME/usr/local/cuda-11.6這樣conda環(huán)境激活時(shí)自動(dòng)加載這些變量退出環(huán)境時(shí)自動(dòng)清理既做到了環(huán)境隔離又不用全局改動(dòng)。5. 版本校驗(yàn)和最容易翻車的三個(gè)場景5.1 nvidia-smi顯示的“CUDA Version”不等于你已安裝的CUDA這是一個(gè)流傳很廣的誤解。nvidia-smi右上角的CUDA Version含義是當(dāng)前驅(qū)動(dòng)最高能支持到什么CUDA版本不是你機(jī)器上已經(jīng)裝好了哪個(gè)版本的CUDA Toolkit。比如你驅(qū)動(dòng)是510.39.01右上角顯示CUDA Version: 11.6這只代表“驅(qū)動(dòng)層面最高支持到11.6”不代表你已經(jīng)裝了11.6編譯器也不代表你的conda環(huán)境里有任何CUDA運(yùn)行時(shí)。如果你在conda環(huán)境里敲nvcc -V得到的結(jié)果是not found然后去nvidia-smi里看到11.6就誤以為“我系統(tǒng)里就有CUDA 11.6啊為什么找不到”——這是兩回事。nvidia-smi是驅(qū)動(dòng)附帶的工具它本身不依賴CUDA Toolkit的安裝。5.2 編譯器的版本和運(yùn)行時(shí)庫版本不匹配報(bào)錯(cuò)很迷惑版本校驗(yàn)時(shí)還有一個(gè)特別容易翻車的情況你確實(shí)在conda環(huán)境里裝了cudatoolkit-dev11.6.0也確認(rèn)nvcc -V輸出了11.6但運(yùn)行時(shí)序依然不對(duì)。典型報(bào)錯(cuò)是編譯出的程序運(yùn)行時(shí)報(bào)error while loading shared libraries: libcudart.so.11.0: cannot open shared object file或者torch內(nèi)部直接RuntimeError: Found GPU0 CUDA Devices... but PyTorch was compiled without CUDA support.這背后的原因通常是你項(xiàng)目里實(shí)際使用的Python框架比如PyTorch原本依賴的是conda channel里的cudatoolkit11.6運(yùn)行時(shí)但你安裝cudatoolkit-dev后它可能把運(yùn)行時(shí)的版本覆蓋掉了或者部分包解析到了11.6.1新版運(yùn)行時(shí)和項(xiàng)目里預(yù)編譯的算子不匹配。我自己的排查習(xí)慣是安裝完dev包后跑一遍conda list | grep cudatoolkit確認(rèn)cudatoolkit和cudatoolkit-dev的大版本一致然后實(shí)際跑一個(gè)小的驗(yàn)證程序python -c import torch; print(torch.cuda.is_available()); print(torch.version.cuda)只有PyTorch版本和nvcc版本都指向11.6這一代才算真正對(duì)齊。5.3 系統(tǒng)里有多個(gè)CUDA版本conda環(huán)境和系統(tǒng)nvcc互踩最折磨人的場景是系統(tǒng)里同時(shí)存在多個(gè)CUDA可能你為別的工作裝了CUDA 11.2在默認(rèn)系統(tǒng)路徑conda環(huán)境里又裝了自己的11.6。由于系統(tǒng)PATH中某些目錄優(yōu)先級(jí)高于conda環(huán)境你激活conda環(huán)境后敲nvcc命中的是系統(tǒng)11.2而不是環(huán)境11.6。這時(shí)你會(huì)得到nvcc: NVIDIA (C) Cuda compiler driver ... release 11.2, V11.2.152項(xiàng)目里其它人都用11.6編譯出來的到你這兒變成11.2最直接的結(jié)果是鏈接失敗出現(xiàn)一堆undefeined reference to錯(cuò)誤或者運(yùn)行時(shí)提示版本不兼容。遇到這種路徑優(yōu)先級(jí)沖突先別急著一通亂改PATH。用where nvccWindows或which -a nvccLinux看看系統(tǒng)里到底有幾個(gè)候選然后確認(rèn)conda環(huán)境自己的可執(zhí)行目錄是否排在前面。如果conda目錄排在后頭有兩條路如方案一那樣在conda環(huán)境里裝cudatoolkit-dev讓環(huán)境自帶真正的nvcc然后確保環(huán)境bin目錄在PATH最前面像方案二的封裝腳本一樣在環(huán)境bin里放置轉(zhuǎn)發(fā)腳本明確指定要用哪個(gè)nvcc。千萬不要直接刪除或改名系統(tǒng)里的舊CUDA目錄你還有其他工程可能依賴它。隔離優(yōu)于清除這是多版本共存環(huán)境的基本紀(jì)律。6. 從11.6這個(gè)版本出發(fā)幾條實(shí)操中的深層經(jīng)驗(yàn)6.1 Linux老系統(tǒng)上glibc和libstdc的坑比nvcc本身更隱蔽如果你最終把CUDA 11.6裝到了Linux服務(wù)器上大概率還會(huì)遇到一堆和系統(tǒng)基礎(chǔ)庫相關(guān)的報(bào)錯(cuò)。熱詞里就出現(xiàn)了glibc_2.28 not found和libstdc.so.6: version GLIBCXX_3.4.21 not found這類報(bào)錯(cuò)在conda環(huán)境里尤其常見。先說原因conda環(huán)境自帶一個(gè)不完整的libc運(yùn)行時(shí)它會(huì)優(yōu)先加載自己目錄下的libstdc.so.6。如果conda環(huán)境里的這個(gè)文件版本比系統(tǒng)里老而CUDA 11.6編譯鏈需要新的GLIBCXX符號(hào)程序跑起來就會(huì)報(bào)找不到對(duì)應(yīng)版本。優(yōu)先嘗試升級(jí)conda環(huán)境里的libstdcconda install -c conda-forge libstdcxx-ng如果還不夠就在運(yùn)行程序前臨時(shí)指定系統(tǒng)庫目錄前提是系統(tǒng)glibc版本夠新export LD_LIBRARY_PATH/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH這屬于環(huán)境兼容性問題跟nvcc是否not found無關(guān)但很多人在配11.6時(shí)會(huì)被這一波連續(xù)報(bào)錯(cuò)帶偏誤以為又裝錯(cuò)了CUDA。提前知道有這層問題排錯(cuò)會(huì)快很多。6.2 項(xiàng)目組成員協(xié)作時(shí)建議把CUDA版本寫死在環(huán)境文件里公司或課題組合作時(shí)光口頭說“用CUDA 11.6”完全不夠因?yàn)槊總€(gè)人機(jī)器上可能被各種原因改成了不同版本。我建議把conda環(huán)境配置固化成文件比如environment.ymlname: cuda116 channels: - conda-forge dependencies: - python3.10 - cudatoolkit11.6.0 - cudatoolkit-dev11.6.0 - pytorch1.12.1其他人直接執(zhí)行conda env create -f environment.yml這樣每個(gè)人激活出的環(huán)境在nvcc版本上絕對(duì)一致。我還喜歡在項(xiàng)目根目錄放一個(gè)Makefile把所有需要nvcc的編譯命令都顯式指定好比如NVCC$(shell which nvcc)并在README里注明“先跑conda activate cuda116再執(zhí)行make”。這能極大減少跨機(jī)器協(xié)作時(shí)的“我這邊編譯過你那邊怎么不行”問題。6.3 時(shí)隔很久再回來看還有一個(gè)小建議如果你是被這個(gè)問題卡住、急著要跑通一個(gè)深度學(xué)習(xí)項(xiàng)目的后來者我個(gè)人的意見是優(yōu)先用方案一在conda環(huán)境里裝cudatoolkit-dev11.6.0然后用nvcc -V確認(rèn)版本號(hào)再跑下游項(xiàng)目。這個(gè)方案不碰系統(tǒng)路徑、不需要管理員權(quán)限、卸載也干凈——直接刪掉conda環(huán)境就全部清掉了。只有當(dāng)你確實(shí)需要cuda-gdb、ncu這類重型工具時(shí)再走方案二安裝完整Toolkit。等你把11.6的環(huán)境跑通了再往新版本遷移的時(shí)候同樣的方法論依然適用先分清驅(qū)動(dòng)、運(yùn)行時(shí)、編譯器三層再?zèng)Q定是用conda包、系統(tǒng)安裝包還是轉(zhuǎn)發(fā)腳本。不管是CUDA 11.6還是12.x這套排查框架都不會(huì)過時(shí)。