現在用的電腦是 21 年配的,當時並沒有 AI 相關的需求,各種各樣的原因吧,抉擇後選擇了 AMD 的顯示卡,但在 2024 年的今天,使用 AI 進行一些工作已不再是什麼罕見的需求,所以我也想嘗試一下,但發現 AMD 顯示卡卻處處碰壁,研究後發現,經過各方面的努力,AMD 顯示卡在 AI 方面的支援已經有了很大的進步,但是由於歷史原因,NVIDIA 顯示卡在這方面的支援更加完善,所以我在這裡記錄一下我在 Windows 環境下使用 AMD 顯示卡執行 AI 程式的過程。
這些步驟現在已經可以透過整合包完成,搜尋“繪世整合包”就能找到,這裡只是記錄一下學習過程,方便學習查閱。
CUDA
首先要說的就是 CUDA,不同於 CPU,GPU 的平行計算能力更強,而 CUDA 就是 NVIDIA 推出的平行計算平臺和程式設計模型,它可以讓開發者對 GPU 進行程式設計,然後在 NVIDIA 的 GPU 上執行,這樣就可以充分利用 GPU 的平行計算能力,而不是隻用來顯示圖形。CUDA 是 NVIDIA 的專利技術,所以 AMD 顯示卡是無法使用 CUDA 的。並且,得益於比較早的推出時間,CUDA 的生態系統也更加完善,有很多的庫和框架都是基於 CUDA 的,比如 TensorFlow、PyTorch 等。
而當下熱門的 AI 繪畫工具 Stable Diffusion 就需要用到 PyTorch,換句話說,如果 AMD 顯示卡能夠支援 PyTorch,那麼就可以執行 Stable Diffusion。
Linux
首先我瞭解到在 Linux 環境下,AMD 顯示卡是可以執行 PyTorch 的,而且 AMD 也推出了 ROCm,這是一個開源的平行計算平臺,可以讓 AMD 顯示卡執行 PyTorch,但是在 Windows 環境下,ROCm 並不支援 PyTorch,所以我們需要另闢蹊徑。
研究過程中也考慮了裝雙系統,但以雙系統的方式來使用 AI 繪畫較為麻煩,可能過一段時間就不想再切換系統了,所以我還是更希望在 Windows 環境下使用 AMD 顯示卡執行 Stable Diffusion。
Linux 環境下的執行效率據說已經沒有什麼損耗了,相關資料很多,這裡不放了。
DirectML
2023 年的方案裡,能看到名為 pytorch-directml 的專案,這是一個 PyTorch 的後端,可以讓 PyTorch 在 Windows 環境下使用 DirectML 執行,而 DirectML 是微軟推出的一個機器學習加速庫,可以讓 PyTorch 在 Windows 環境下使用 AMD 顯示卡執行。
在經過社群的努力後,克服重重困難,pytorch-directml 專案已經可以在 Windows 環境下使用 AMD 顯示卡執行 PyTorch 了,這就為我們提供了一個在 Windows 環境下使用 AMD 顯示卡執行 Stable Diffusion 的方案。
stable-diffusion 最有名的整合包 AUTOMATIC1111/stable-diffusion-webui 的 wiki 中也有 AMD 顯示卡的使用說明,但是這個專案並沒有直接支援 AMD 顯示卡,所以我們需要使用一個 fork 專案。wiki 截圖如下:
透過連結跳轉到對應專案,發現名稱已經變了——lshqqytiger/stable-diffusion-webui-amdgpu,這個專案早期應該是叫做 stable-diffusion-webui-directml
,可以看出現在並不僅限於使用 pytorch-directml,後面我們會提到。
下圖是 GPU-Z 的截圖,可以看到顯示卡對 DirectML 以及 CUDA 的支援情況,雖然本文一直說的是 AMD 顯示卡,但實際上 Intel 的顯示卡也有一部分支援 DirectML,理論上也是可以使用這個方案的,不過案例較少,沒有了解,這裡不詳細說明了。
參考資料:
在 windows 上透過 pytorch-directml 利用 AMD 顯示卡加速 stable-diffusion
ROCm
AMD ROCm 是一個開放式軟體棧,包含多種驅動程式、開發工具和 API,可為從底層核心到終端使用者應用的 GPU 程式設計提供助力。ROCm 已針對生成式 AI 和 HPC 應用進行了最佳化,並且能夠幫助輕鬆遷移現有程式碼。
定位應該和 CUDA 類似,這個只要到官網下載安裝就行了,目前的 Stable Diffusion 應該是隻能使用 5.7 版本的,下載包命名的時間是 23 年 Q4。
PyTorch
PyTorch 是一種用於構建深度學習模型的功能完備框架,是一種通常用於影像識別和語言處理等應用程式的機器學習。使用 Python 編寫,因此對於大多數機器學習開發者而言,學習和使用起來相對簡單。PyTorch 的獨特之處在於,它完全支援 GPU,並且使用反向模式自動微分技術,因此可以動態修改計算圖形。這使其成為快速實驗和原型設計的常用選擇。
如果使用 DirectML 方案,那麼就需要安裝 pytorch_directml:
pip install torch-directml
Python
既然反覆提到 PyTorch,那這裡在說一下 Python,相關學習資料多如牛毛,這裡不過多介紹了,主要說一下版本問題,與前端的 Node.js 環境類似,不同版本適配情況也不同,能做的工作也不一樣,所以需要的一個類似版本切換的工具,Node.js 使用的是 nvm,Python 可以用 Conda,原理不太一樣,Conda 是建立一個對應版本的虛擬環境,然後在虛擬環境中安裝對應版本的 Python,這樣就可以在不同的專案中使用不同的 Python 版本了。如果不是經常用到 Python 開發的話,使用 MiniConda 就可以了,這個是一個輕量級的 Conda,只包含了最基本的功能,不會佔用太多空間。
- 下載安裝
latest-miniconda-installer-links
- 建立虛擬環境
上面的 DirectML 方案中,Wiki 有提到推薦 Python 3.10.6
# 建立虛擬環境
conda create -n pytdml python=3.10.6
# 第一次使用需要初始化
conda init
# 啟用虛擬環境
conda activate pytdml
# 安裝 pytorch_directml
pip install torch-directml
參考資料:
在 Windows 上透過 DirectML 啟用 PyTorch
ZLUDA
其實說了那麼多 DirectML,但是實際上這個方案現在已經不是最好的了,而且 DirectML 仍然不能將 AMD 顯示卡的效能全部發揮出來,今年 2 月份,ZLUDA 釋出了 AMD 顯示卡版本,可以讓 AMD 顯示卡執行 CUDA 程式,這樣就可以在 Windows 環境下使用 AMD 顯示卡執行 Stable Diffusion 了。
ZLUDA 是非 NVIDIA GPU 上 CUDA 的替代方案。ZLUDA 允許使用非 NVIDIA GPU 執行未修改的 CUDA 應用程式,具有接近原生效能。
理論上,只需安裝好 ROCm,然後直接使用 CUDA 版的 pytorch,再用 lshqqytiger 編譯的版本替換對應的 CUDA dll 檔案,即可直接在 Windows 上執行。
lshqqytiger 版本:https://github.com/lshqqytiger/ZLUDA
另外,webui 推薦 SD.NEXT automatic,這個版本對 AMD 顯示卡支援更好,我最後是用這個版本跑起來的。執行 webui.bat,預設啟動在 7860 埠,第一次啟動要編譯十幾二十分鐘,耐心等待,介面如下圖:
我之前已經掛載過模型了,如果第一次進入可能會讓你選擇一個模型。加個提示詞隨便輸出一張,尺寸最好不要太大,512×512 就行,原因會在另一篇專門講生成的文章裡說:
可以看到 GPU 的佔用已經上去了,說明此時已經是在用顯示卡進行計算了:
總結
-
安裝 ROCm
-
安裝 Python
-
安裝 PyTorch
-
安裝 ZLUDA(主要是配置環境變數)
-
替換 CUDA dll 檔案
-
執行 webui(後來發現整合包好像可以自動處理 PyTorch 等,我這邊已經裝好了就沒法驗證)
這一篇主要還是記錄一下自己的學習過程,後續在生成方面就打算直接用整合好的包了,功能更加全面,會比自己搭建的方便一些,這樣能更集中精力在具體的生成上,而不是在環境上浪費太多時間。