# 大型語言模型LLMs課程教學 課程大綱 (五)
## [高階] 如何於國網超級電腦台灣杉二號使用多顆GPU微調語言模型
## :memo: Where do I start?
- 聯絡窗口 Email us : 2303117@narlabs.org.tw 王小姐
### 課程說明
- 上課時間: 2024 3/12 星期一 9:00-10:30
- 上課方式: 視訊課程 (請參考信件說明)
- 基本能力: 皆可
- 環境需求: Windows或Mac或Linux作業系統環境皆可
### 課程內容:
- 本堂課為示範教學為主, 下課後若學員有興趣, 會保留時間讓學員實地操作, 課程說明如下
### :A: 簡報檔案:
- [[高階課程 PDF]](https://drive.google.com/file/d/1bWrcc1u1kdRhBXpVK8Dwbdr5cC9mXxjK/view?usp=sharing)
- [[程式碼 GITHUB]](https://github.com/c00cjz00/deepspeed_code.git)
### :B: 教學文件
- [初階課程] [建立基於RAG方案的專屬私有知識庫教學](https://hackmd.io/@whYPD8MBSHWRZV6y-ymFwQ/ryqUCfu6T)
- [中階課程] [基於RAG方案的專屬私有知識庫服務網站建置](https://hackmd.io/@whYPD8MBSHWRZV6y-ymFwQ/Bk3TbayAp)
- [高階課程] [如何於國網台灣杉二號使用多顆GPU微調語言模型](https://hackmd.io/@whYPD8MBSHWRZV6y-ymFwQ/SklMGVOaT)
### A. 台灣杉二號 (TAIWANIA 2)介紹 <font color="#f00">[請自己閱讀]</font>
* 帳號註冊
- [註冊網址](https://iservice.nchc.org.tw/nchc_service/nchc_member_apply_0.php)
- [文件說明](https://man.twcc.ai/@twccdocs/guide-twnia2-prerequisite-for-connection-zh)
* 計算資源
- [文件說明](https://man.twcc.ai/@twccdocs/guide-twnia2-compute-capability-zh)
* 儲存資源
- [文件說明](https://man.twcc.ai/@twccdocs/guide-twnia2-storage-capability-zh)
* 登入與檔案傳輸節點
- [文件說明](https://man.twcc.ai/@twccdocs/guide-twnia2-login-and-data-transfer-node-zh)
* 如何登入主機
- [文件說明](https://man.twcc.ai/@twccdocs/guide-twnia2-login-and-logout-zh)
* 如何執行檔案傳輸
- [文件說明](https://man.twcc.ai/@twccdocs/doc-hfs-main-zh/%2F%40twccdocs%2Fhfs-overview-zh)
* GPU Queue
- [文件說明](https://man.twcc.ai/@twccdocs/guide-twnia2-queue-zh)
* Slurm提交工作
- [文件說明](https://man.twcc.ai/@twccdocs/howto-twnia2-run-parallel-job-container-zh#Step-4-%E6%92%B0%E5%AF%AB-Slurm-Job-Script)
### :flag-tw: B. 台灣杉二號操作方法介紹 [現場示範]
* 課程重點: 學習如何使用Singularity操作Docker Image
- [教學文件](https://hackmd.io/@whYPD8MBSHWRZV6y-ymFwQ/H1r-_wbHT)
- [範例影片](https://youtu.be/ogKFcLj0cSw)
- [LLama-factory] https://github.com/c00cjz00/llama-factory-docker
* 課程重點: 學習如何派送 HPC Slurm job
- [教學文件](https://hackmd.io/@whYPD8MBSHWRZV6y-ymFwQ/B1wplDWST)
- [範例影片](https://youtu.be/Xl1liXv14As)
* 課程重點: 如何啟動 Jupyter Notebook操作介面
- [教學文件](https://hackmd.io/@whYPD8MBSHWRZV6y-ymFwQ/H1eKSV9jp6)
- [範例影片](https://youtu.be/IALJNs-Ho-U6)
* 課程重點: 如何建立 Singularity Image kernel in Jupyter Notebook
- [教學文件](https://hackmd.io/@whYPD8MBSHWRZV6y-ymFwQ/HkNVrcsT6)
- [範例影片](https://youtu.be/N7BwcdMYl2k)
### :flag-tw: C. 如何於國網超級電腦台灣杉二號使用多顆GPU微調語言模型 [現場示範]
* GITHUB: https://github.com/c00cjz00/deepspeed_code.git
* DEEPSPEED 介紹
- ZeRO主要包括三個等級的最佳化:ZeRO-1,ZeRO-2和ZeRO-3,每個等級都在前一個等級的基礎上進行了進一步的最佳化。
- [教學文件](https://hackmd.io/@whYPD8MBSHWRZV6y-ymFwQ/r1A88Lip6)
* 模型所需要的硬體資源
- [詳細程式碼說明文件](https://hackmd.io/@whYPD8MBSHWRZV6y-ymFwQ/ByQAPIoTa)
- 概略程式碼範例如下
```
from transformers import AutoModel
from deepspeed.runtime.zero.stage_1_and_2 import estimate_zero2_model_states_mem_needs_all_live
model = AutoModel.from_pretrained("/work/u00cjz00/slurm_jobs/github/models/Llama-2-7b-chat-hf")
estimate_zero2_model_states_mem_needs_all_live(model, num_gpus_per_node=1, num_nodes=1
```
* 單顆GPU微調語言模型
- python
- [詳細程式碼說明文件](https://hackmd.io/@whYPD8MBSHWRZV6y-ymFwQ/SylNV8opp)
- 概略程式碼範例如下
```
CUDA_VISIBLE_DEVICES=0 python src/train_bash.py
```
* 多顆GPU微調語言模型
- deepspeed (指定GPU --include localhost:0,1)
- [詳細程式碼說明文件](https://hackmd.io/@whYPD8MBSHWRZV6y-ymFwQ/SJiIzHoap)
- 概略程式碼範例如下
- zero0 (DDP), zero1 (優化器狀態分片), zero2 (梯度優化分片), zero3 (參數優化分片) )
```
#參數設定
export GPUS_PER_NODE=2 #GPU數量
#執行工作
deepspeed \
--num_gpus ${GPUS_PER_NODE} \
src/train_bash.py \
--deepspeed ds_config.json
```
- 跨節點微調語言模型 (多台電腦)
- torchrun + deepspeed
- [詳細程式碼說明文件](https://hackmd.io/@whYPD8MBSHWRZV6y-ymFwQ/rytivEiaT)
- 概略程式碼範例如下
- zero0 (DDP), zero1 (優化器狀態分片), zero2 (梯度優化分片), zero3 (參數優化分片) )
```
#參數設定
export GPUS_PER_NODE=2 #GPU數量
export MASTER_ADDR=gpn3002 #Master HOSTNAME
export MASTER_PORT=9001 #Master IP
#執行工作
##${SLURM_NNODES} ${SLURM_PROCID} 為系統自動給予參數
torchrun \
--nproc_per_node ${GPUS_PER_NODE} \
--master_addr ${MASTER_ADDR} \
--master_port ${MASTER_PORT} \
--nnodes ${SLURM_NNODES} \
--node_rank ${SLURM_PROCID} \
src/train_bash.py \
--deepspeed ds_config.json
```
### :flag-tw: D. 資料處理 [現場示範]
* 微調模型資料下載
- [詳細程式碼說明文件](https://hackmd.io/@whYPD8MBSHWRZV6y-ymFwQ/rJhJ3P26T)
- 概略程式碼範例如下
```
from datasets import load_dataset
dataset = load_dataset("michaelwzhu/ChatMed_Consult_Dataset", split="train", streaming=True,encoding='utf-8')
```
* 繁體簡體中文互轉
- 概略程式碼範例如下
```
import opencc #繁体简体互转 s2t or s2twp
op_cc=opencc.OpenCC('s2twp')
op_cc.convert("现在你是一名专业的中医医生,请用你的专业知识提供详尽而清晰的关于中医问题的回答。"),
```