返回文章這是一篇在 lablab.ai 上為 AMD 開發者黑客松而建構的完整教學,內容涵蓋如何使用 AMD MI300X 在 MedMCQA 資料集上對 Qwen3-1.7B 模型進行 LoRA 微調。醫療問答是一個風險極高的任務。一個模型若在臨床多選題中自信地選錯答案,不僅是錯誤,更可能造成危險。
然而,大多數開源醫療 AI 專案都預設使用者擁有 NVIDIA GPU,CUDA 成為預設標準,其他選項則被視為次要。本專案旨在挑戰這一假設。MedQA 是一個完全基於 AMD 硬體、使用 ROCm 平台建構的 LoRA 微調臨床問答模型。
它能接收醫療多選題,並回傳正確答案的選項字母及臨床解釋。整個訓練流程,從資料載入到適配器匯出,都在 AMD Instinct MI300X 上運行,完全沒有任何 CUDA 依賴。🤗 模型在 HuggingFace Hub:HK2184/medqa-qwen3-lora 🚀 線上示範:HuggingFace Spaces 💻 GitHub:MedQA-Medical-AI-on-AMD-ROCmAMD Instinct MI300X 是一款卓越的硬體:單一裝置擁有 192 GB 的 HBM3 記憶體。
對於大型語言模型(LLM)微調而言,VRAM 往往是主要限制,它決定了批次大小、序列長度以及是否需要進行量化。憑藉 192 GB 的可用記憶體,我們能夠以完整的 fp16 格式對 Qwen3-1.7B 進行 LoRA 訓練,無需任何 4 位元或 8 位元量化技巧。
更重要的是,本專案旨在證明 HuggingFace 生態系統 — Transformers、PEFT、TRL、Accelerate — 能夠在 ROCm 上無縫運行。事實證明確實如此。在 CUDA 上運行的相同訓練程式碼,只需設定三個環境變數即可在 ROCm 上運行:os.environ["ROCR_VISIBLE_DEVICES"] = "0"os.environ["HIP_VISIBLE_DEVICES"] = "0"os.environ["HSA_OVERRIDE_GFX_VERSION"] = "9.4.2"就這樣。
無需更改程式碼,無需自訂核心,也無需 CUDA 相容性墊片。MedMCQA 是一個大規模的多選題資料集,源自印度的醫學入學考試(AIIMS、USMLE 風格)。每個範例包含:一個臨床問題、四個答案選項(A–D)、正確答案的索引,以及一個可選的自由文字解釋(exp 欄位)。
本專案使用了 2,000 個訓練樣本,這是一個刻意選擇的小型子集,旨在證明有意義的微調可以快速實現。在 MI300X 上訓練大約耗時 5 分鐘。基礎模型是 Qwen/Qwen3-1.7B — 阿里巴巴最新的小型語言模型。它擁有 17 億個參數,體積小巧,足以進行低成本微調,同時也具備產生連貫臨床推理的能力。
它支援 trust_remote_code=True,並能透過 HuggingFace Transformers 順利載入。提示詞格式的一致性對於指令微調至關重要。每個訓練範例和每個推論呼叫都使用相同的模板:### Question:{question}### Options:A) {opa}B) {opb}C) {opc}D) {opd}### Answer:{answer_letter}) {answer_text}### Explanation:{explanation}在訓練期間,模型會看到包含答案和解釋的完整序列。
在推論時,我們提供直到 ### Answer:\n 的所有內容,然後讓模型從那裡開始完成。我們沒有微調全部 15 億個參數,而是透過 PEFT 函式庫使用 LoRA(低秩適應)。LoRA 會將小型可訓練的秩分解矩陣注入到注意力層中,同時保持基礎權重凍結。
模型 15 億個參數中,只有約 220 萬個被訓練。這有助於保持記憶體使用量低並加速訓練。有幾點值得注意:fp16=True, bf16=False — 我們使用標準的 fp16。在早期使用 bfloat16 的實驗中,我們遇到了 NaN 損失;切換到 fp16 後完全解決了這個問題。
gradient_checkpointing=True — 這是以計算換取記憶體。考慮到 MI300X 擁有 192 GB VRAM,這並非絕對必要,但在較小的 GPU 上為了重現性,這是一個好習慣。gradient_accumulation_steps=4 — 實際批次大小為 4,有效批次大小為 16。
帶有暖身階段的餘弦學習率排程 — 對於短期訓練而言,比固定排程能實現更平滑的收斂。訓練完成後,./outputs 資料夾會包含 LoRA 適配器的權重 — 這些檔案只有幾 MB,而非數 GB 的完整模型檢查點。在推論時,我們載入基礎模型,附加 LoRA 適配器,並可選擇性地合併權重:生成過程使用貪婪解碼(do_sample=False),並帶有重複懲罰機制,以防止模型陷入循環:問題:以下哪項是高血壓急症的一線治療?
A) 口服 amlodipineB) 靜脈注射 labetalol 或靜脈注射 nitroprussideC) 舌下含服 nifedipineD) 肌肉注射 hydralazine模型輸出:B) 靜脈注射 labetalol 或靜脈注射 nitroprusside解釋:靜脈注射 labetalol(β-阻斷劑)或 nitroprusside 能在急症情況下迅速降低血壓。
口服藥物作用過慢,不適用於需要立即控制血壓以防止終端器官損傷的高血壓急症。模型不僅僅輸出一個選項字母,它還會解釋原因,這正是其在臨床上具有實用價值之處。這個經過微調的適配器已公開發布。您可以直接載入它,而無需複製儲存庫:沒有 AMD ROCm 專案是沒有挑戰故事的。
以下是我們遇到的問題:挑戰:NaN 損失,根本原因:混合精度不穩定,解決方案:從 bfloat16 切換到 fp16。挑戰:GPU 未偵測到,根本原因:缺少 ROCm 環境變數,解決方案:設定 ROCR_VISIBLE_DEVICES、HIP_VISIBLE_DEVICES、HSA_OVERRIDE_GFX_VERSION。
挑戰:bitsandbytes 不支援,根本原因:bitsandbytes 沒有 ROCm 版本,解決方案:完全放棄量化 — MI300X 有足夠的 VRAM。挑戰:推論輸出混亂,根本原因:Tokenizer 填充配置錯誤,解決方案:設定 pad_token = eos_token 並修正 padding_side。
挑戰:Trainer 評估錯誤,根本原因:Transformers 版本不匹配,解決方案:固定 transformers>=4.40.0。bitsandbytes 的問題值得一提:在 NVIDIA 硬體上,通常需要 4 位元量化才能將模型載入記憶體。
但在擁有 192 GB HBM3 的 MI300X 上,這完全沒有必要。這是一個真正的硬體優勢 — 訓練更清晰,沒有量化造成的失真。可訓練參數:約 2.2M(佔總數 0.15%)。在 MI300X 上的訓練時間:約 5 分鐘。使用的資料集大小:2,000 個樣本。
MedMCQA 基準準確度:約 45%。框架:PyTorch + ROCm 6.1。沒有 GPU?沒問題。Gradio 線上示範在 HuggingFace Spaces 上運行(CPU 推論):👉 HuggingFace Spaces 線上示範有 AMD 硬體?
複製儲存庫並在本機運行:git clone https://github.com/HK2184/MedQA-Medical-AI-on-AMD-ROCm.gitcd MedQA-Medical-AI-on-AMD-ROCm pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/rocm6.1 pip install transformers datasets peft accelerate trl gradio python train.py # 約 5 分鐘 python infer.py # 運行範例問題 python app.py # 啟動 Gradio UI本專案證明了這個流程是可行的。
下一步將是擴展和強化它:更大的資料集 — 在完整的 MedMCQA 語料庫(約 18 萬個問題)上進行訓練並加入 PubMedQA。信心評分 — 在答案旁增加校準的信心估計。RAG 整合 — 將答案建立在即時醫療文獻檢索的基礎上。評估框架 — 在訓練集之外進行適當的保留集準確度基準測試。
MedQA 專案展示了在開源 AMD 硬體上建構一個有能力、可解釋的醫療 AI 不僅可行,而且相當直接。HuggingFace 生態系統對 ROCm 的相容性確實很好。MI300X 的記憶體餘裕消除了整類工程問題。而 LoRA 讓微調一個 17 億參數的模型只需 5 分鐘。
如果您正在 AMD ROCm 上開發並遇到困難,上述的解決方案應該能為您省下數小時。如果您正在建構醫療 AI,那麼將重點放在解釋而非單純的準確性上,是值得認真考慮的。為 lablab.ai 上的 AMD 開發者黑客松而建構 · 由 AMD ROCm + HuggingFace 生態系統提供支援 *— Harikrishna Sivanand Iyer 和 Srijan Sivaram A
