境配置)
Anaconda 這個(gè)名字做數(shù)據(jù)、做科研、做深度學(xué)習(xí)的人基本繞不開。但真正讓人頭疼的從來(lái)不是裝不上而是裝完之后那一堆連帶問(wèn)題Navigator 更新完打不開了、conda 和 pip 混著用把環(huán)境搞成一鍋粥、PyCharm 死活找不到解釋器、服務(wù)器上裝完conda命令不生效。我自己前前后后在不同機(jī)器上裝過(guò)十幾遍 Anaconda從 Windows 筆記本到?jīng)]有圖形界面的 Linux 服務(wù)器踩的坑足夠?qū)懸槐拘?cè)子。這篇就把 Anaconda Navigator 更新這條線作為切入點(diǎn)把下載、安裝、環(huán)境變量、虛擬環(huán)境、PyTorch 配置、PyCharm 聯(lián)動(dòng)、報(bào)錯(cuò)排查這一整條鏈路串起來(lái)講一遍盡量寫成那種照著做就不會(huì)翻車的版本。不管你是剛接觸 Python 環(huán)境管理的新手還是被某個(gè)報(bào)錯(cuò)卡了半天想找答案的老手應(yīng)該都能從里面撈到點(diǎn)有用的東西。1. 裝之前先想明白Anaconda 到底替你管了什么很多人對(duì) Anaconda 的理解停留在一個(gè)裝好 Python 的安裝包這個(gè)認(rèn)知本身沒(méi)錯(cuò)但太淺了。搞不清楚它內(nèi)部的層級(jí)關(guān)系后面遇到問(wèn)題就只能靠重裝解決而重裝恰恰是最低效的手段。所以這一節(jié)先把結(jié)構(gòu)捋清楚。1.1 三個(gè)層級(jí)發(fā)行版、conda、Navigator把 Anaconda 拆開看其實(shí)是三層?xùn)|西疊在一起。最底層是Anaconda 發(fā)行版也就是你下載的那個(gè)幾百兆的安裝包比如Anaconda3-2024.10-1-Windows-x86_64.exe這種。它一次性地把一個(gè) Python 解釋器、幾百個(gè)常用的第三方庫(kù)、以及配套的工具鏈塞進(jìn)你的硬盤。這個(gè)安裝包是快照裝上之后里面的 Python 版本就固定了不會(huì)自己變。中間層是conda一個(gè)包管理器和環(huán)境管理器。它負(fù)責(zé)裝包、卸包、建虛擬環(huán)境、切換環(huán)境。conda 和 pip 最大的區(qū)別在于conda 管的不只是 Python 包還能管 Python 解釋器本身、C 編譯出來(lái)的二進(jìn)制庫(kù)、甚至非 Python 的依賴比如 CUDA 運(yùn)行時(shí)。這就是為什么搞深度學(xué)習(xí)的同學(xué)更傾向于用 conda 裝 PyTorch——它能把顯卡驅(qū)動(dòng)之外的那一套依賴一起給你配齊。最上層才是Anaconda Navigator一個(gè)圖形界面外殼。它把 conda 的命令行操作包裝成點(diǎn)按鈕還內(nèi)置了 Jupyter Notebook、Spyder、VS Code 這些應(yīng)用的啟動(dòng)入口。Navigator 本身不是一個(gè)獨(dú)立軟件它依賴 conda 的 Python 環(huán)境運(yùn)行所以在 base 環(huán)境被搞壞的時(shí)候Navigator 往往是第一個(gè)受害者。這三層的關(guān)系決定了排查問(wèn)題的方向界面打不開問(wèn)題大概率在下面兩層。Navigator 閃退的時(shí)候你去重裝 Navigator 通常只能治標(biāo)真正該查的是 conda 版本和 base 環(huán)境的狀態(tài)。1.2 為什么會(huì)有人裝完就后悔Anaconda 有個(gè)被吐槽很多年的點(diǎn)體積大。完整版裝完加上緩存占掉三到五個(gè) G 是很正常的。原因在于它預(yù)裝了太多你可能一輩子用不到的科學(xué)計(jì)算庫(kù)Anaconda 官方這么做的邏輯是寧可多給也別讓你裝到一半卡住畢竟對(duì)一個(gè)剛?cè)腴T的人來(lái)說(shuō)編譯某個(gè)庫(kù)失敗是最勸退的事情。另一個(gè)后悔點(diǎn)是PATH 污染。安裝向?qū)Ю镉幸粋€(gè)勾選項(xiàng)問(wèn)你要不要把 Anaconda 加進(jìn)系統(tǒng) PATH 環(huán)境變量官方默認(rèn)是不勾的很多人圖方便手動(dòng)勾了結(jié)果系統(tǒng)里原來(lái)裝的 Python、或者某些工具自帶的 Python 就被頂?shù)袅顺霈F(xiàn)我明明裝了 3.10命令行走出來(lái)是 3.7這種詭異現(xiàn)象。我個(gè)人的做法是Windows 上堅(jiān)決不勾那個(gè)選項(xiàng)日常操作全部走 Anaconda PromptLinux 上則用conda init讓 shell 自動(dòng)接管因?yàn)榉?wù)器上基本不會(huì)有別的 Python 干擾反而需要自動(dòng)化。這兩種策略的差異會(huì)在第 3 節(jié)展開。提示如果你已經(jīng)在 Windows 上勾了 PATH也不用慌??梢缘较到y(tǒng)屬性 - 環(huán)境變量里把 Anaconda 相關(guān)的幾條路徑刪掉然后重新打開命令行驗(yàn)證python --version是否回到了原來(lái)的版本。1.3 什么時(shí)候該考慮 Miniconda說(shuō)句實(shí)在話如果你只是偶爾跑個(gè)腳本或者服務(wù)器磁盤緊張Miniconda 是更克制的選擇。它只包含 conda 和 Python 本身不預(yù)裝任何第三方庫(kù)裝完大概幾百兆。后續(xù)需要什么自己conda install就行。代價(jià)是沒(méi)有 Navigator也沒(méi)有預(yù)裝的 Jupyter、Spyder。對(duì)于習(xí)慣圖形界面的新手來(lái)說(shuō)上手門檻會(huì)高一點(diǎn)。我的判斷標(biāo)準(zhǔn)很簡(jiǎn)單如果你連命令行都不想碰裝完整版 Anaconda如果你已經(jīng)能熟練敲pip install直接上 Miniconda。這篇后面的內(nèi)容兩者都適用只是 Navigator 相關(guān)的部分只針對(duì)完整版。2. 安裝包怎么挑版本號(hào)與鏡像站實(shí)操第一節(jié)講清楚了概念接下來(lái)就是動(dòng)手。下載這一步看著簡(jiǎn)單實(shí)際上版本挑錯(cuò)、下載源選錯(cuò)后面會(huì)多出不少麻煩。2.1 版本號(hào)里每一位是什么含義Anaconda 的安裝包命名格式是這樣的Anaconda3-2024.10-1-Windows-x86_64.exe拆開看Anaconda3表示這版綁定的是 Python 3.x 系列2024.10是發(fā)行日期代表 2024 年 10 月發(fā)布的快照后面那個(gè)-1是同一個(gè)月內(nèi)的第幾版修訂通常用來(lái)修 bug再往后是平臺(tái)和架構(gòu)Windows-x86_64就是 64 位 WindowsLinux 平臺(tái)對(duì)應(yīng)Linux-x86_64蘋果的 M 系列芯片則是MacOSX-arm64。這里有幾個(gè)容易踩的點(diǎn)日期號(hào)越大不等于越適合你。新版本帶的是更新的 Python 和更新的庫(kù)但一些老項(xiàng)目、特別是依賴 C 擴(kuò)展的科研庫(kù)在新 Python 上可能還沒(méi)有預(yù)編譯好的 wheel裝的時(shí)候會(huì)現(xiàn)場(chǎng)編譯慢不說(shuō)還容易失敗。穩(wěn)妥做法是選一個(gè)發(fā)布半年到一年、社區(qū)反饋比較多的版本。-1這種修訂號(hào)別忽略。同一日期號(hào)的初版有時(shí)會(huì)有已知 bug官方會(huì)補(bǔ)一版修訂。如果看到某個(gè)版本有-0和-1兩個(gè)優(yōu)先選后者。架構(gòu)千萬(wàn)別選錯(cuò)。Windows 上有x86_6464 位和x8632 位之分現(xiàn)在幾乎沒(méi)有理由再用 32 位了。蘋果用戶要注意區(qū)分x86_64Intel 芯片和arm64M 系列芯片選錯(cuò)的話要么裝不上要么靠轉(zhuǎn)譯跑性能差一截。2.2 國(guó)內(nèi)下載為什么更推薦走鏡像站官網(wǎng)的下載服務(wù)器在境外直連的速度有時(shí)候只有幾十 KB/s一個(gè) 700MB 的安裝包能下到你懷疑人生。國(guó)內(nèi)高校和云廠商維護(hù)的鏡像站是同步官網(wǎng)內(nèi)容的速度可以跑到滿帶寬。清華的 TUNA 鏡像站是國(guó)內(nèi)用得最多的一個(gè)它的 Anaconda 歸檔目錄路徑大致是https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/打開這個(gè)目錄會(huì)看到一個(gè)按字母和數(shù)字排序的文件列表名字特別長(zhǎng)找起來(lái)有點(diǎn)費(fèi)眼睛。有個(gè)小技巧這個(gè)頁(yè)面支持參數(shù)排序和篩選。比如加上查詢參數(shù)可以讓它按修改時(shí)間倒序排列最新的安裝包就浮到最上面了省得你去翻頁(yè)。類似?CMOD這樣的參數(shù)組合C表示排序字段O表示升降序具體含義各家頁(yè)面略有差異你也可以直接用瀏覽器自帶的頁(yè)內(nèi)搜索去匹配關(guān)鍵字。除了歸檔目錄鏡像站一般還有miniconda和anaconda/pkgs這兩個(gè)重要目錄。前者放的是 Miniconda 的安裝包后者是 conda 的軟件包倉(cāng)庫(kù)——這個(gè) pkgs 目錄就是后面配置.condarc時(shí)要填的地址先記住它。國(guó)內(nèi)的鏡像選擇不止清華一家其他的高校鏡像和云廠商鏡像內(nèi)容基本一致速度上因地區(qū)和運(yùn)營(yíng)商而異。經(jīng)驗(yàn)之談哪個(gè)快就用哪個(gè)不用迷信某一家配置的時(shí)候也沒(méi)必要把所有鏡像都堆上去頻道多了反而容易因?yàn)橥讲灰恢聦?dǎo)致依賴解析失敗。2.3 校驗(yàn)一下再裝能省掉一半玄學(xué)問(wèn)題下載完安裝包花十秒鐘核對(duì)一下大小和校驗(yàn)值能擋掉很多裝到一半報(bào)錯(cuò)的情況。鏡像站的文件一般在大文件旁邊會(huì)帶一個(gè)校驗(yàn)文件格式大概是# Linux / macOS 下核對(duì) shasum -a 256 Anaconda3-2024.10-1-Linux-x86_64.sh # Windows PowerShell 下核對(duì) Get-FileHash .\Anaconda3-2024.10-1-Windows-x86_64.exe -Algorithm SHA256把輸出結(jié)果和官方給出的值對(duì)一下一致就說(shuō)明文件完整。不一致基本就是下載中斷或者被網(wǎng)絡(luò)中間環(huán)節(jié)改了刪掉重下別硬著頭皮裝。注意別用迅雷之類的多線程下載工具去抓這類安裝包有時(shí)候拼接出來(lái)的文件會(huì)出問(wèn)題表面看著像下完了裝到后半段才報(bào)錯(cuò)。用瀏覽器原生下載或者curl、wget最穩(wěn)。3. 三個(gè)平臺(tái)的安裝實(shí)操安裝這一步不同平臺(tái)的注意事項(xiàng)差別挺大。Windows 是圖形向?qū)Э简?yàn)的是勾選項(xiàng)判斷Linux 服務(wù)器是命令行安裝考驗(yàn)的是你有沒(méi)有把 shell 初始化做對(duì)。3.1 Windows安裝向?qū)Ю锬菐讉€(gè)勾到底怎么選雙擊安裝包之后會(huì)走一個(gè)不算短的向?qū)Я鞒剃P(guān)鍵節(jié)點(diǎn)有這么幾個(gè)。安裝類型這一步會(huì)讓你選Just Me還是All Users。如果這臺(tái)電腦只有你一個(gè)人用選Just Me裝到用戶目錄下不需要管理員權(quán)限如果是公司電腦或者多人共用的機(jī)器選All Users裝到公共目錄。對(duì)絕大多數(shù)人來(lái)說(shuō)前者就夠了。安裝路徑這一步很關(guān)鍵。默認(rèn)路徑長(zhǎng)這樣C:\Users\你的用戶名\anaconda3理論上能用但我不推薦。原因有三一是用戶名里可能有中文或者空格某些老工具處理不了這種路徑二是 C 盤空間緊張的時(shí)候很尷尬三是后面配置 IDE 的時(shí)候路徑短一點(diǎn)眼睛舒服。我一般改成D:\anaconda3或者D:\dev\anaconda3這種。路徑里絕對(duì)不要有中文、空格和特殊符號(hào)這是硬性要求不是建議。高級(jí)選項(xiàng)這一步有兩個(gè)勾是最容易出問(wèn)題的地方。第一個(gè)是Add Anaconda3 to my PATH environment variable。官方在這個(gè)選項(xiàng)下面用紅字標(biāo)注不推薦理由是可能和系統(tǒng)里已有的軟件沖突。這個(gè)警告是認(rèn)真的Windows 上請(qǐng)不要勾。你需要用 conda 的時(shí)候從開始菜單打開Anaconda Prompt就行那個(gè)窗口會(huì)自動(dòng)把環(huán)境變量配好。第二個(gè)是Register Anaconda3 as my default Python。這個(gè)勾上問(wèn)題不大它會(huì)幫你把 Anaconda 的 Python 注冊(cè)成系統(tǒng)的默認(rèn) Python別的軟件調(diào)用 Python 時(shí)會(huì)找到它。如果你機(jī)器上已經(jīng)有別的 Python 環(huán)境并且正在用就別勾如果是新機(jī)器勾上省事。裝完之后從開始菜單找到 Anaconda Prompt敲一行conda --version python --version兩條都有正常輸出安裝就算成功了。這一步一定要做別等后面用 Navigator 出問(wèn)題了才回來(lái)確認(rèn)。3.2 Linux 服務(wù)器靜默安裝與 shell 初始化服務(wù)器上沒(méi)有圖形界面Navigator 基本用不上裝 Anaconda 的目的就是拿到 conda 和 Python 環(huán)境。把.sh安裝包傳到服務(wù)器上scp或者wget都行然后# 賦予執(zhí)行權(quán)限 chmod x Anaconda3-2024.10-1-Linux-x86_64.sh # 開始安裝-b 是靜默模式-p 指定安裝路徑 bash Anaconda3-2024.10-1-Linux-x86_64.sh -b -p $HOME/anaconda3-b這個(gè)參數(shù)很重要它讓安裝過(guò)程不再交互式提問(wèn)包括那個(gè)拉到底才出現(xiàn)的許可協(xié)議確認(rèn)適合腳本化部署。-p指定安裝位置裝在用戶目錄下不需要 root 權(quán)限也避免了對(duì)系統(tǒng)目錄的污染。如果你的服務(wù)器有共享存儲(chǔ)而且多人要用也可以裝到/opt/anaconda3這類公共位置但要處理好權(quán)限。安裝腳本跑完之后最后一屏通常會(huì)說(shuō)需要你關(guān)掉終端重開或者手動(dòng) source 一下。這里就是新手最容易卡住的地方——裝完了敲conda提示 command not found。原因是安裝腳本雖然往~/.bashrc里寫了初始化代碼但當(dāng)前這個(gè) shell 還沒(méi)重新加載配置。執(zhí)行source ~/.bashrc或者在 Bash 里直接跑一遍初始化命令$HOME/anaconda3/bin/conda init bash source ~/.bashrcconda init的作用是往 shell 的啟動(dòng)文件里注入一段腳本讓每次開新終端時(shí)自動(dòng)加載 conda 的函數(shù)定義順便把 base 環(huán)境激活。你的服務(wù)器如果用 Zsh 而不是 Bash把bash換成zsh就行。提示如果conda init之后每次開終端都自動(dòng)進(jìn) base 環(huán)境而你不想這樣可以執(zhí)行conda config --set auto_activate_base false。這個(gè)設(shè)置特別適合服務(wù)器場(chǎng)景避免你登錄進(jìn)去意外在一個(gè)不該用的環(huán)境里跑任務(wù)。3.3 環(huán)境變量到底要不要手工配關(guān)于Linux 下要手動(dòng)設(shè)置 Anaconda 環(huán)境變量這個(gè)說(shuō)法網(wǎng)上流傳很廣但我想把它說(shuō)清楚正式做法是用conda init不是手改 PATH。手改的做法一般是在~/.bashrc里加這么一行export PATH/home/你的用戶名/anaconda3/bin:$PATH這行確實(shí)能讓conda、python這些命令可用但它有個(gè)副作用它把 Anaconda 的 bin 目錄直接塞進(jìn)了 PATH 最前面所有 Python 相關(guān)的命令都會(huì)被 Anaconda 覆蓋而且繞過(guò)了 conda 的環(huán)境切換機(jī)制。你會(huì)發(fā)現(xiàn)在這種配置下conda activate的行為可能不太正常。conda init寫進(jìn)去的是一段 shell 函數(shù)定義邏輯是按需把當(dāng)前環(huán)境的路徑插到最前面比硬改 PATH 要優(yōu)雅得多。所以正確的順序是先用conda init實(shí)在有問(wèn)題再考慮手改 PATH 作為臨時(shí)方案。還有一些同學(xué)遇到過(guò)環(huán)境變量里混進(jìn)了奇怪內(nèi)容的 warning比如引號(hào)或者變量拼接錯(cuò)誤導(dǎo)致的warning。這種一般是因?yàn)閪/.bashrc里被反復(fù)追加了多份 conda 初始化代碼或者某一行引號(hào)沒(méi)配對(duì)。排查方法很簡(jiǎn)單grep -n conda ~/.bashrc看看文件里是不是有多段重復(fù)的初始化塊。有的話留一段、刪掉其余然后source ~/.bashrc重新驗(yàn)證。4. Navigator 更新與閃退常見(jiàn)毛病一次說(shuō)透這一節(jié)是本篇的重點(diǎn)。Navigator 用久了會(huì)出現(xiàn)兩類問(wèn)題一是提示有更新更完就出問(wèn)題二是直接閃退或者卡在啟動(dòng)界面。這兩件事的根因其實(shí)高度相關(guān)。4.1 更新的正確順序別一上來(lái)就點(diǎn)按鈕Navigator 的圖形界面里有個(gè)更新按鈕點(diǎn)下去它會(huì)更新自己。這個(gè)操作的坑在于Navigator 是被 conda 管理的包它自己更新自己的時(shí)候依賴關(guān)系可能被攪亂。更穩(wěn)的做法是關(guān)掉 Navigator打開 Anaconda PromptWindows或者終端Linux/macOS按順序執(zhí)行# 第一步先更新 conda 本體它是地基 conda update -n base conda # 第二步更新 Navigator conda update -n base anaconda-navigator # 第三步如果還想把 base 里其他包一起升用這條 conda update --all這里第三步要謹(jǐn)慎。conda update --all會(huì)把 base 環(huán)境里所有包升到最新聽(tīng)起來(lái)很爽但它破壞了依賴解析的穩(wěn)定性——某些包之間有版本約束全升可能導(dǎo)致沖突。我的習(xí)慣是base 環(huán)境盡量保持干凈只裝 conda、navigator 這一類工具所有業(yè)務(wù)依賴都放到獨(dú)立虛擬環(huán)境里。這樣 base 出問(wèn)題的概率低很多真要全升也不心疼。如果你確實(shí)想要一個(gè)確定的 Navigator 版本可以用帶版本號(hào)的安裝方式conda install -n base anaconda-navigator2.6.0版本號(hào)以你實(shí)際環(huán)境的可用版本為準(zhǔn)先用conda search anaconda-navigator看看有哪些可選。4.2 閃退與卡在 loading applications 的排查路徑Navigator 啟動(dòng)時(shí)做的事情大致是加載配置、讀取環(huán)境列表、聯(lián)網(wǎng)拉取可安裝應(yīng)用的元信息、渲染界面。這幾個(gè)環(huán)節(jié)任一失敗都可能表現(xiàn)為閃退或者界面卡住。癥狀一點(diǎn)了圖標(biāo)沒(méi)有任何反應(yīng)或者窗口一閃就沒(méi)了。這種情況下圖形界面什么都不告訴你得去命令行里啟動(dòng)才能看到報(bào)錯(cuò)信息# Windows 在 Anaconda Prompt 里執(zhí)行 anaconda-navigator # 或者 python -m anaconda_navigator命令行里會(huì)打印出真實(shí)的異常棧。常見(jiàn)的幾類原因和對(duì)應(yīng)處理現(xiàn)象可能原因處理方式導(dǎo)入某個(gè) Qt 相關(guān)模塊失敗PyQt / qt 包版本錯(cuò)亂conda install -n base pyqt5重裝界面庫(kù)提示 conda 版本過(guò)舊或 API 不匹配Navigator 和 conda 版本脫節(jié)先升 conda再升 navigator卡在加載配置配置文件損壞清理緩存目錄后重啟網(wǎng)絡(luò)超時(shí)拉取應(yīng)用元信息失敗配置國(guó)內(nèi)頻道鏡像癥狀二界面卡在 loading applications。這是最經(jīng)典的一個(gè)。它在做的事是聯(lián)網(wǎng)獲取應(yīng)用列表網(wǎng)絡(luò)不通或者超時(shí)就一直轉(zhuǎn)圈。解決辦法是給 conda 換成國(guó)內(nèi)鏡像源。在用戶目錄下新建或編輯.condarc文件Windows 在C:\Users\你的用戶名\.condarcLinux/macOS 在~/.condarc內(nèi)容大致是channels: - defaults show_channel_urls: true default_channels: - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2 custom_channels: conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud寫完之后執(zhí)行conda clean -i清掉索引緩存然后重新打開 Navigator。癥狀三配置文件或緩存壞了。Navigator 會(huì)在用戶目錄下存一份自己的配置和緩存路徑是~/.anaconda/navigatorWindows 對(duì)應(yīng)%USERPROFILE%\.anaconda\navigator。這個(gè)目錄壞掉的表現(xiàn)很隨機(jī)有時(shí)候是界面白屏有時(shí)候是按鈕點(diǎn)不動(dòng)。處理方式是把整個(gè)目錄改名做個(gè)備份讓它重新生成# Linux / macOS mv ~/.anaconda/navigator ~/.anaconda/navigator.bak anaconda-navigator --resetWindows 下把.anaconda\navigator文件夾重命名然后在 Anaconda Prompt 里執(zhí)行anaconda-navigator --reset。4.3 說(shuō)到底Navigator 還值不值得用講真等你熟悉了命令行之后Navigator 的價(jià)值會(huì)迅速下降。它最大的好處是給新手一個(gè)可視化的環(huán)境管理入口能直觀看到有哪些環(huán)境、每個(gè)環(huán)境裝了哪些包。但它的啟動(dòng)速度、穩(wěn)定性都不如直接敲命令而且在沒(méi)有圖形界面的服務(wù)器上根本用不了。我現(xiàn)在的習(xí)慣是本地機(jī)器上保留 Navigator偶爾用來(lái)看一眼環(huán)境列表所有實(shí)際操作用命令行完成。這樣既能享受圖形化的便利又不會(huì)被它的穩(wěn)定性問(wèn)題綁架。對(duì)剛?cè)腴T的同學(xué)我的建議是先熟悉幾個(gè)核心命令——conda create、conda activate、conda install、conda env list、conda remove——這五個(gè)用熟了Navigator 出不出問(wèn)題都不影響你干活。5. 虛擬環(huán)境與 PyTorch 環(huán)境配置環(huán)境管理是 Anaconda 真正發(fā)揮作用的地方也是新手最容易搞混的部分。這一節(jié)從建環(huán)境講到裝 PyTorch。5.1 建環(huán)境時(shí)那幾個(gè)參數(shù)怎么定一個(gè)標(biāo)準(zhǔn)的建環(huán)境命令長(zhǎng)這樣conda create -n pytorch-env python3.10逐個(gè)參數(shù)拆解-n pytorch-env是給環(huán)境起名字。名字建議用有意義的英文短名別用env1、test2這種過(guò)兩個(gè)月你自己都想不起來(lái)是干嘛的。不要用中文和空格某些工具鏈處理不了。python3.10指定 Python 版本。這個(gè)參數(shù)建議永遠(yuǎn)帶上不指定的話 conda 會(huì)給你裝一個(gè)新版本而這個(gè)新版本可能和你要用的深度學(xué)習(xí)框架還不兼容。深度學(xué)習(xí)這塊Python 版本跟著框架的官方支持走穩(wěn)妥區(qū)間一般是 3.9 到 3.11。如果需要指定環(huán)境的存放位置比如放到數(shù)據(jù)盤可以用-p /path/to/env代替-n 名字但說(shuō)實(shí)話用名字管理更省心。建好之后激活conda activate pytorch-env你會(huì)看到命令提示符前面的括號(hào)從(base)變成了(pytorch-env)。退出用conda deactivate。查看所有環(huán)境用conda env list刪環(huán)境用conda remove -n pytorch-env --all。注意刪環(huán)境這個(gè)命令的--all參數(shù)不能省否則 conda 只會(huì)刪掉環(huán)境里的某個(gè)包而不是整個(gè)環(huán)境。這個(gè)坑我見(jiàn)過(guò)太多人踩。5.2 conda 源和 pip 源要分開配這是個(gè)高頻誤區(qū)很多人以為配了一個(gè)鏡像源就萬(wàn)事大吉了結(jié)果conda install走的是鏡像pip install還是直連境外慢得讓人崩潰。原因是conda 和 pip 用的是兩套完全獨(dú)立的配置體系。conda 的源寫在第 4 節(jié)提到的.condarc里。pip 的源要用它自己的命令配置pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple pip config set global.trusted-host pypi.tuna.tsinghua.edu.cn第一條設(shè)置默認(rèn)索引地址第二條把域名加入信任列表某些環(huán)境下不加這兩條會(huì)有 SSL 相關(guān)告警。配置完可以用pip config list確認(rèn)。也可以臨時(shí)指定不寫進(jìn)配置pip install 某個(gè)包 -i https://pypi.tuna.tsinghua.edu.cn/simple這里有個(gè)經(jīng)驗(yàn)在同一個(gè)環(huán)境里盡量不要 conda 和 pip 混著裝同一個(gè)包的依賴鏈。比如用 conda 裝了 numpy又用 pip 裝了一個(gè)依賴 numpy 的包pip 可能會(huì)把 conda 裝的那份 numpy 覆蓋成 PyPI 上的版本兩份包的元數(shù)據(jù)記錄不一致后面conda list顯示的版本和實(shí)際導(dǎo)入的版本對(duì)不上排查起來(lái)非常痛苦。我的原則是能用 conda 裝就用 conda 裝conda 里實(shí)在沒(méi)有的特別是一些小眾的、純 Python 的包再用 pip。裝之前先用conda search 包名確認(rèn)一下有沒(méi)有。5.3 PyTorch 安裝與驗(yàn)證PyTorch 的安裝命令不是固定的它跟你的顯卡、CUDA 版本強(qiáng)相關(guān)必須去官網(wǎng)的安裝選擇器生成不能隨便復(fù)制別人博客上的命令。大體形式有這么幾種# 走 conda 裝帶 CUDA 支持的版本 conda install pytorch torchvision torchaudio pytorch-cuda11.8 -c pytorch -c nvidia # 走 pip 裝用官方指定的索引 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 # 純 CPU 版本體積小適合沒(méi)有獨(dú)顯的機(jī)器 conda install pytorch torchvision torchaudio cpuonly -c pytorch裝完之后一定要驗(yàn)證別裝完就開始跑代碼python -c import torch; print(torch.__version__); print(torch.cuda.is_available())輸出應(yīng)該先打印版本號(hào)再打印True或False。如果第二行是False而你機(jī)器上確實(shí)有 NVIDIA 顯卡那說(shuō)明裝的是 CPU 版本或者 CUDA 版本和驅(qū)動(dòng)不匹配。這時(shí)候別急著卸載重裝先把版本對(duì)齊關(guān)系理一遍檢查項(xiàng)命令說(shuō)明驅(qū)動(dòng)支持的最高 CUDAnvidia-smi右上角顯示的 CUDA Version 是驅(qū)動(dòng)上限框架編譯時(shí)的 CUDApython -c import torch; print(torch.version.cuda)必須小于等于驅(qū)動(dòng)上限顯卡是否可見(jiàn)nvidia-smi列表里能看到顯卡型號(hào)常見(jiàn)錯(cuò)誤是把驅(qū)動(dòng)上限和框架版本搞反了。比如驅(qū)動(dòng)只支持到 CUDA 11.8你裝了一個(gè)編譯在 CUDA 12.x 上的 PyTorchcuda.is_available()就是False。正確做法是裝一個(gè)低于驅(qū)動(dòng)上限的版本而不是去升級(jí)驅(qū)動(dòng)服務(wù)器上驅(qū)動(dòng)往往不是你說(shuō)了算。6. PyCharm 聯(lián)動(dòng) Anaconda環(huán)境配好了怎么讓 PyCharm 用上它是另一個(gè)高頻問(wèn)題。這一步出錯(cuò)的表現(xiàn)通常是PyCharm 里 import 報(bào)紅但命令行里明明能跑。6.1 解釋器到底該指向哪個(gè)文件PyCharm 配置解釋器的路徑是File - Settings - Project - Python Interpreter點(diǎn)齒輪圖標(biāo)選Add然后選Conda Environment再選Existing environment最后在輸入框里指向你的環(huán)境路徑。這個(gè)路徑在不同系統(tǒng)下不一樣# Windows D:\anaconda3\envs\pytorch-env\python.exe # Linux / macOS /home/用戶名/anaconda3/envs/pytorch-env/bin/python注意要指向的是envs/環(huán)境名/下面的 Python不是 Anaconda 根目錄下的 Python。指向根目錄的 Python 就等于在用 base 環(huán)境你裝的 PyTorch 在另一個(gè)環(huán)境里自然 import 不到。如果下拉框里干脆沒(méi)有你建的環(huán)境通常是 PyCharm 沒(méi)找到 conda 的可執(zhí)行文件。這時(shí)候要手動(dòng)指定 conda 的位置# Windows 通常是 D:\anaconda3\condabin\conda.bat # Linux / macOS 通常是 /home/用戶名/anaconda3/bin/conda注意 Windows 上指向的是condabin目錄下的conda.bat不是Scripts目錄下的conda.exe。這個(gè)細(xì)節(jié)坑過(guò)不少人。6.2 三個(gè)高頻坑和對(duì)應(yīng)處理坑一PyCharm 內(nèi)置終端不激活環(huán)境。PyCharm 底部的 Terminal 默認(rèn)可能走的是系統(tǒng) shell里面敲conda activate提示命令不存在。解決辦法是在 Settings 里搜 Terminal把 Shell path 改成對(duì)應(yīng)的 shell或者在 Settings 的 Tools - Terminal 里勾上激活虛擬環(huán)境的選項(xiàng)。更省事的辦法是直接用系統(tǒng)終端別在 IDE 里糾結(jié)??佣牧谁h(huán)境但運(yùn)行配置沒(méi)跟著變。PyCharm 的 Run Configuration 里有一項(xiàng) Python interpreter有時(shí)候它鎖定的是舊環(huán)境。改了項(xiàng)目解釋器之后記得去 Run - Edit Configurations 里確認(rèn)一下運(yùn)行配置用的是哪個(gè)解釋器??尤窂嚼镉兄形膶?dǎo)致 pip 裝包失敗。這個(gè)屬于老生常談但每年都有人中招。環(huán)境和項(xiàng)目路徑里有中文時(shí)一些包在編譯階段會(huì)因?yàn)榫幋a問(wèn)題直接失敗報(bào)錯(cuò)信息還特別隱晦。從建環(huán)境那天起就把路徑規(guī)范好比事后救火輕松得多。7. 報(bào)錯(cuò)速查與徹底卸載最后一節(jié)整理兩類內(nèi)容一是常見(jiàn)報(bào)錯(cuò)的對(duì)照排查二是當(dāng)你想徹底重來(lái)時(shí)的干凈卸載流程。7.1 一份可以對(duì)著查的報(bào)錯(cuò)表報(bào)錯(cuò)信息片段大概率原因處理方向cannot import name xxx from yyy包的版本升級(jí)后 API 變了查該包的版本變更記錄調(diào)整導(dǎo)入方式或降版本ModuleNotFoundError: No module named xxx包沒(méi)裝或裝到了別的環(huán)境conda list確認(rèn)檢查當(dāng)前激活的是哪個(gè)環(huán)境ImportError: DLL load failed二進(jìn)制依賴缺失或被覆蓋重裝相關(guān)包別混用 conda 和 pipconda: command not foundshell 未初始化執(zhí)行conda init后 source 配置文件PackagesNotFoundError頻道里沒(méi)這個(gè)包換頻道或改用 pipSolving environment: failed依賴沖突新建一個(gè)干凈環(huán)境重裝別在舊環(huán)境里硬解這里拿第一條舉個(gè)例子因?yàn)檫@類報(bào)錯(cuò)最容易被誤判成環(huán)境壞了重裝吧。有位同學(xué)跑地球物理正演腳本時(shí)遇到這樣的報(bào)錯(cuò)ImportError: cannot import name mesh from simpeg他第一反應(yīng)是環(huán)境裝錯(cuò)了準(zhǔn)備刪掉重來(lái)。實(shí)際上這不是環(huán)境問(wèn)題而是SimPEG 這個(gè)庫(kù)在新版本里做了模塊拆分網(wǎng)格相關(guān)的部分被移到了discretize這個(gè)獨(dú)立包里原來(lái)從simpeg頂層導(dǎo)入mesh的寫法自然就失效了。正確的排查順序應(yīng)該是這樣先確認(rèn)當(dāng)前裝的版本conda list simpeg或pip show simpeg。去查這個(gè)版本的變更說(shuō)明看mesh這個(gè)子模塊去哪了。按照新版本的用法改導(dǎo)入語(yǔ)句比如改成從新的包導(dǎo)入或者用新的類名。如果短期內(nèi)不想改代碼可以考慮退回到 API 沒(méi)變的舊版本pip install simpeg舊版本號(hào)。這個(gè)例子的普適價(jià)值在于看到 ImportError先懷疑版本和 API再懷疑環(huán)境。重裝一個(gè)環(huán)境要花十幾分鐘查一次版本記錄可能只要兩分鐘。7.2 想徹底重來(lái)的時(shí)候卸載要?jiǎng)h干凈哪幾樣Anaconda 的卸載比安裝更需要耐心殘留的配置文件和緩存會(huì)在你重裝后繼續(xù)生效導(dǎo)致新裝的還是同樣的問(wèn)題。Windows 上的順序是這樣。先用官方提供的清理工具清掉配置文件conda install anaconda-clean anaconda-clean --yes這個(gè)工具會(huì)把散落在用戶目錄下的 conda 相關(guān)配置文件挪到備份目錄。然后從控制面板 - 程序和功能里卸載 Anaconda最后手工檢查幾個(gè)目錄是否還殘留D:\anaconda3 # 主安裝目錄 C:\Users\你的用戶名\.conda # 環(huán)境配置 C:\Users\你的用戶名\.condarc # 頻道配置 C:\Users\你的用戶名\.anaconda # Navigator 配置緩存Linux 上多一步把~/.bashrc里conda init注入的那一段代碼刪掉也就是以# conda initialize 開頭、# conda initialize 結(jié)尾的那一整個(gè)塊。刪完之后重開終端conda命令應(yīng)該就不存在了。環(huán)境變量里如果還有手工加過(guò)的 Anaconda 路徑一并清理。我自己現(xiàn)在的做法是不用官方卸載器直接手動(dòng)刪目錄加清配置反而更快也更干凈。前提是你確認(rèn)沒(méi)有別的軟件依賴這套 Python。7.3 一點(diǎn)個(gè)人心得折騰環(huán)境這么多年我最后悔的事情之一是沒(méi)有在第一次裝完 Anaconda 之后就把.condarc和 pip 源配好。那會(huì)兒每次裝包都在等下載慢得心態(tài)崩。后來(lái)把鏡像配齊之后裝一個(gè)深度學(xué)習(xí)環(huán)境從半小時(shí)降到五分鐘。另一個(gè)體會(huì)是環(huán)境要小而專。我現(xiàn)在一臺(tái)機(jī)器上會(huì)有七八個(gè)環(huán)境每個(gè)環(huán)境只服務(wù)一個(gè)項(xiàng)目互不干擾??粗伎臻g但出問(wèn)題的時(shí)候直接刪掉重建就行不會(huì)有刪了它別的項(xiàng)目就跑不起來(lái)的顧慮。base 環(huán)境則當(dāng)成一個(gè)只放管理工具的空殼盡量不往里裝業(yè)務(wù)包。這套習(xí)慣養(yǎng)成之后我?guī)缀踉贈(zèng)]有遇到過(guò)環(huán)境徹底崩了要重裝 Anaconda的情況。