# HiPAC 2024 CUDACOLA 隊檢討會暨參賽報告
日期:2024/08/14 (三)
時間:14:00 - 16:01
地點:Google Meet ( https://meet.google.com/eih-yvda-ojw )
## 議程
- 競賽日誌回顧
- 心得分享
- 檢討建議
- 撰寫參賽報告
## 競賽日誌回顧
### 賽前
- 6/20
- 國網盃群組成立
- 6/24
- 跟老師線上討論參賽計畫書怎麼寫
- 從國網盃 10 人中,拆分成 CUDA 組與 OpenMPI 組,按照個人意願各自選
- 6/25
- 17:00-21:00 試 CUDA & 寫計畫書
- 18:49 確定隊名訂為 CUDACOLA<!-- 其實我當初是發出「哭阿」的聲音,被郁芳聽成 COLA -->
- 確定我們有能力完成 CUDA 環境建置
- 使用 Paperspace 雲端機器,美金 $0.45/hr 和儲存費用另計
- GPU: NVIDIA Quadro M4000 (8 GB GPU memory)
- 軟體: NVIDIA Container Toolkit + CUDA container
- 6/27
- 16:00-隔天00:30 繼續把參賽計畫書寫完
- 凌晨的google meet大合照

(郁芳的螢幕截圖)
- 6/28
- 完成參賽計畫書,寄出給比賽單位
- 7/10
- 13:30-16:30 參加官方賽前教育訓練
- 20:00-隔天00:10 討論各自要準備讀什麼,分工
- 7/11 - 7/23
- 大家各自研究,寫出自己所負責部份的架環境 SOP 文件
- 練習和測試環境
- Paperspace
- Hyperstack
- 有 NVIDIA 顯卡的個人電腦
- 自己電腦內 2 台虛擬機
- 7/24
- 19:00-23:50 照著 SOP 接力進行架環境演練
- 使用 Hyperstack 雲端機器,美金 $0.30/hr
- GPU: NVIDIA RTX A4000
- 7/26
- 19:00 PIConGPU 和 NAMD 分組討論
- PIConGPU 有跑成功內建 LaserWakefield example
- 8/2
- 10:00-12:00 郁芳 HPCxAI 夏令營心得分享會
- 13:30 Slurm 研討會
### 第一天早上(8/6 10:00 ~12:00)
- (從新竹以外地方出發的人) 持主辦單位幾天前寄到家裡的高鐵票(指定車次對號座),早起坐高鐵於 08:03 或 08:11 抵達高鐵新竹站,在高鐵站出口處轉乘比賽大巴士接駁車
- 抵達國網比賽現場
- 持學生證簽到,拿到免費送的 T-shirt 、玻璃水壺、識別證名牌
- 在國際會議室聽出題者現場講解題目敘述
- 隊長們抽籤決定是要用哪個攤位區,家正抽到 3 號位置
- 於攤位收到發放物資:延長線、帳密 A4 紙、綠色乖乖x2
- 拿到裝有題目的隨身碟,此時還不能連上網路<!-- 這個隨身碟後來送給我們,被家正帶回家了 -->
- 鳴笛開始比賽
- 用紙上寫的 WiFi SSID 帳密來連上會場網路,僅能透過此 WiFi 來 SSH 進比賽機器
- SSH 進 pca1, pca2 所需的 host, port, username, password 同樣寫在這張紙上
- 在 pca1, pca2 新增 user: cudacola,置入 SSH public key
- 攤位上方有個電視可以播東西給評審、工作人員或其他參賽者看

(照片由家正拍攝,以 [CC-BY 4.0](https://creativecommons.org/licenses/by/4.0/deed.zh-hant) 授權釋出)
::: spoiler
家正這幾天有播放:
- tmux 上下分割畫面對主機效能監控
- `htop`, `nvtop` 或 `watch -n1 "w |sort -n -k 5"`
- 可愛動物影片: Cute Baby Animals 🐻 4K - Relaxation Film with Peaceful Relaxing Music and Animals Video Ultra HD
- 令人放鬆的大自然風景: 3 Hours of Amazing Nature Scenery & Relaxing Music for Stress Relief.
- Rickroll 瑞克搖 原版/保險公司版/but it's all nature
- 《鹿乃子乃子乃子虎視眈眈》洗腦 OP 主題曲 1 小時版
- 《玩命關頭》第 7, 9, 10 集電影預告片
- 巴哈動畫瘋上的《鹿乃子乃子乃子虎視眈眈》第 6 集
:::
- 安裝與Debug Nvidia Driver, CUDA toolkit, OpenMPI
- 安裝 Mellanox OFED Driver-24.04-0.7.0.0
- 安裝 icc-2021.4.0
- 安裝 mkl
- 午休吃便當
- 炸雞丼飯 / 烤排骨飯 / ... 多種便當任君選擇
- 小餅乾糖果是隨時能去 B1 拿
- 還有可自由取用的桶裝咖啡、冰綠茶,以及限量罐裝可樂、黑咖啡
### 第一天下午(8/6 13:00 ~18:00)
- NAMD-2.14編譯CPU版本並提交第一題的CPU部分
- 處理Nvidia driver和cuda的問題
- 15:00 下午茶:油條麵包夾蛋、大杯康青龍紅茶三分糖去冰
### 第二天早上(8/7 10:00 ~12:00)
- 享用飯店早餐 buffet
- 生醫題、電漿題 出題者分別召集各隊到中間聽補充說明
- 解決Nvidia driver和cuda的問題
- NAMD-2.14編譯GPU版本,並提交第一題GPU部分
- 繼續Debug OpenMPI(4.1.4)
- 嘗試安裝 PIConGPU
- 有些 dependency 能用 Spack 裝得起來,但出題者給的 hackmd 小抄上寫的 cmake 版本號碼在 spack public repo 上找不到
- 午餐有要價 $120 的便當 / 壽司
### 第二天下午(8/7 13:00 ~18:00)
- 發現OpenMPI版本不相容,嘗試升級至OpenMPI 5.0.3但因為時間排程關係無法實裝Production
- NAMD-2.14嘗試配置雙節點運行。在另一個節點上安裝icc、Nvidia driver、Cuda、NFS、設定SSH開放端口2201和2202,在使用GPU版本時失敗,改成CPU版本,最後時間不夠,設置為背景運行,準備明天察看結果。
- 15:00 下午茶點心
> 多到吃不下了,下次可不可以叫他們不用準備我的份OAO [name=家正]
- 遇到 PIConGPU 比賽題目一定要用到 HDF5,但我們沒事先練過怎麼裝
- slurm太晚才試,導致出問題來不及修改
### 第三天早上(8/8 09:30 ~11:30)
- 享用飯店早餐 buffet
- 公佈隱藏題
- NAMD-2.14第三題提交,被評審回報有問題,3分鐘後,評審來到攤位上說明是使用CPU版本導致的問題,成績被採錄。
- PyFR 安裝失敗,主要為matrix multiplication error和找不到METIS lib path,據清大的同學說,他們同樣遇到這些問題,並且現場沒有一組在時間內執行出結果。
- PyFR第二題可以成功以單GPU跑起來,但因時間不足最後失敗。
- 密碼破解題提供一個base64編碼,解碼後是 [GitLab連結](https://gitlab.td.nchc.org.tw/cchou0519/hipac24-password-recovery),是題目的描述。
- 題目只給要破解的密文,沒指定說要怎麼解,於是經過 Google 搜尋「password cracking tool」,選了資安 CTF 比賽常用且支援 CUDA 加速的 hashcat 作為解題使用程式
- 有 2500 個 hash 要解,且有 MD5, MD5crypt, bcrypt 這三種演算法的加密結果混雜在其中
- 提供一個有提示的密碼,解出後可得到字典本,可加速後續破解。
- 寫了 Python script 來弄字串處理,試著把上面每種加密方法根據前綴來篩選,變成 3 個 .txt 檔案,每個 .txt 檔案裡只有單純一種加密法
- 寫了 shell script 把字典檔分割成 4 等分,嘗試一次執行多個 hashcat 來平行化
- 用 curl 來提交答案
- 但在比賽結束前仍未跑出一組解答
- 趕工做成果簡報
### 第三天下午(8/8 12:30~20:00)
- 成果報告講給評審聽
- 抽籤決定順序,我們抽到第一組
- 10分鐘簡報,要報告HPL, HPCG, PIConGPU, NAMD2, 解密題, PyFR,時間不夠用
- 10分鐘回答問題,問答題要速記全部人的提問,小組成員討論 2 分鐘後,再回答
- 沒等到攝影機採訪
- 到階梯教室聽參賽者座談
- 去年得獎學長姊分享
- 出題者講可用的解題技巧、設計理念
- 密碼破解其實可以從 MD5 開始破,需要計算量最小最快能取得成果
- 生醫題藉由 3 個階段引導參賽者由淺入深,嘗試榨乾硬體效能
- 電漿題聲稱說照著 hackmd 步驟照做就能跑出來,但裡面寫的 cmake 有個版本在 Spack public repo 找不到是故意的
- 去看國網展示用機房、模型
- 放的都是以前專案購置的機器,台灣杉們在別處
- 聽到講解關於實體機房需要的線路、氣體冷卻、防地震鋼架
- 問要買什麼硬體來練習,蝦皮或淘寶 (特定零件型號郁芳有拍起來)
- 頒獎典禮
- 隊呼:「嘿!」,發想 by 芊瑀
- 各個隊伍得獎感言都會提到他們準備快一年,有誰誰誰的幫助
- 晚宴YAY
- 與其他隊討論技術
## 心得分享
<!-- 想要偷偷說的東西放註解裡XD -->
### 益翔
- 學到的東西
- [hlajungo Note](https://hackmd.io/2deAUP8zQ-u1giVioCOdaQ)
- 建議的步驟
<!-- Written by Chatgpt-->
- 構建環境
嘗試去弄出一個實體環境或用虛擬機模擬(較不推薦),盡量在cpu、gpu、作業系統、網路去還原環境。
- 了解系統
確認CPU、GPU、作業系統、內核版本,用`lscpu`、`nvidia-smi`、`uname -a`等。
- 確定目標
選擇你要安裝或使用的軟體版本前,看看能選的範圍,考慮硬體、驅動和系統的限制
- 語言與編譯器
確認你用的程式語言和編譯器版本
- 管理依賴
列出依賴項,注意版本範圍。學會檢查、更新或移除這些版本。
- 管理版本
記錄所有用到的版本,當兩個目標要使用相同套件的不同版本時,考慮用Conda或其他套件版本管理套件來管理版本
- 自動測試
寫腳本自動測試,調整參數,收集結果
- 數據可視化
用工具像gnuplot來視覺化數據
- 了解怎麼閱讀cpu使用率、gpu使用率、記憶體使用量。
`htop`和`nvidia-smi`
- 心得
架設環境和編譯用掉了9成的時間,執行和調適只用了1成的時間,我事先花費太多時間在調適上,如果可能的話,嘗試配置實體比賽環境,實體雙節點infinite band設備 > 實體雙節點 ethernet設備 > 雙gpu虛擬機模擬雙節點 > cpu only虛擬機模擬雙節點。
### 俊翔
提前了解所有Dependencies並畫出相依性順序圖可以有效的提升環境建置效率,並且管理排程工具必須要提前設定好,不要因為賽前有建制成功就覺得可以偷懶。
報告必須抓緊時間,並且定期與隊友打暗號,因為一個人容易Tunnel Vision太專注於某個東西,才不會有超時的情況產生
### 芊瑀
slurm儘量早點試,因為可能發生"想用的"和"實際發生的"不一樣,也可以試試看`salloc`這個指令先try try(我的看法,比賽時我太緊張忘了)。
PIConGPU我走保守路線(按照之前演練方法),結果卡在driver版本問題。
### 郁芳
第一天在環境建置時,彼此的安裝和版本一直有衝突,當我基於原本的CUDA版本編譯了mpi,卻在之後的測試環節發現nvidia driver不見了,因此建議當有影響隊員的環境變動時,須及時通知其他隊員,保持良好的溝通,第三天晚宴跟冠軍隊伍交流後,瞭解`module`這個工具的重要性,這能幫助我們在同一個node(電腦)、同一個帳號下實現不同session的環境變數彼此獨立。
### 家正
第二次當校外比賽隊長,講了好多話,還去跟其他學校隊伍聊天,我都不知道我能那麼外向。
有嘗試用了 [doodle](https://doodle.com/en/) 這套調查大家有空開會時間的投票工具,感想是滿好用的,但免費版有限制,可改用[開源的替代品](https://opensource.com/article/22/4/open-source-alternatives-doodle-polls)。
有時候會太心軟或想偷懶,有選擇時都決定往比較輕鬆的路走。例如說或許可以叫隊員都去看一整套超算培訓影片,但想說不知道會不會用到,就先懶得看;也或許可以再硬一點。
有些技巧能夠事先讓隊員學會的,其實我能教學,但不太確定需不需要,這次以後就稍微知道必修和選修知識有哪些。
看完 [Open MPI 官網影片](https://www.open-mpi.org/video/?category=general)真是醍醐灌頂,很多名詞都融會貫通弄懂意思和串連起來,而且從裡面知道這個 MPI 生態系其實很龐大,有好多個社群在朝這方向努力。
## 給下屆建議
<!--
Note: Soloman: ACM要依據這些建議規劃出對應的培訓活動。
Nvidia Driver和cuda版本衝突。
錯誤的安裝步驟導致同時存在兩個Nvidia Driver。
隊裡有需要不同版本的Nvidia Driver和cuda。
-->
- 不要看某個的軟體的版本超級舊就不想用
- 例如 hpl-2.0_FERMI (有 GPU 加速的 benchmark) 我們決賽前有看到但略過不練,到比賽真的出出來這題目有些後悔XD
- 下屆題目不一定會出這程式,版本號碼僅供參考
- 有時候用最新版軟體反而會造成相依問題,例如 CUDA, OpenMPI
- 去看完清大 [SC24](https://hackmd.io/@NTHUSC/Hyu41J4oi/https%3A%2F%2Fhackmd.io%2F%40kuokuoyiyi%2Fry7t3kJG2) 教學影片
- 因為我們跟第一名隊伍交流發現他們有事先教 Linux, binary, dynamic linking 觀念,和第三名隊伍的高中生們也是 Linux 高手,在影片裡都有教
- slurm不要想到才安裝,提早完成
- 可以斟酌要不要用 Spack 來幫助安裝某些套件,因為某些隊伍對 Spack 同樣沒好印象 (他們在吐槽: 誰還用 spack),要用的話要賽前就學會
- 去研究一下如何同台機器多個 CUDA 版本共存
- 處理同環境在裝不同版本函式庫的時候能不打架
- `sudo apt install environment-modules`
- 把想 load 的套件 compile 好之後,寫個 modulefile 來 include 進去 (要再研究設定方法)
- `module load <???>` 之後只會在那個人的 session 有變動環境變數 PATH
- 也可以 `module unload <???>` 等方法來隨時把套件從環境變數中移除,神器一個
- 能找其他 lab 借顯卡,第一名隊伍有人說他跟兩個老師保持良好關係<!-- 暨大可找信宏lab -->
- 找能出錢出力的學長姐當教練,有機會幫生出 InfiniBand 網卡等硬體設備可以做練習環境<!-- 玄學 -->
- [Grafana](https://grafana.com/) 架 web dashboard 可以有歷史資料、複雜的圖表呈現
- 還需要安裝我們需要的某後端 prometheus exporter,來把資料倒給前端 web 來顯示
- 在還沒有 web dashboard 的時候也可以在命令列用下列指令看
- `htop` 可看即時 CPU 用量
- `nvtop` 可看即時 GPU 用量
- `watch -n1 "w |sort -n -k 5"` 看最近有在執行指令的 session, 以 IDLE time 做排序[(source)](https://www.linuxquestions.org/questions/linux-general-1/how-can-i-sort-the-w-output-by-idle-time-666807/)
- k8s、container建議先不要碰,跨節點container很麻煩
- 可以真的非常有空的人賽前慢慢研究,但在比賽場上先不要
- 有空可去參加國網教育訓練: [Singularity容器運算技術介紹與實作](https://edu.nchc.org.tw/course/one_course_introduction.asp?lms_auto_course_id=4111&from_course_list_url=course_index)
- 因為前期解決 container 的問題所花的時間,會遠大於解決 HPC 問題的
- 不要無腦用太多顯卡會IO Bound(bottleneck 在 I/O)
- 可以刷考古題(三大超級電腦大賽: 德國ISC與美國SCC、中國ASC),或參加線上競賽 (ISC Student Cluster Competition virtual/remote team) 作練習
- 要啃別的超級電腦大賽隊伍寫的共筆
- 清大 [SCC會議記錄](https://hackmd.io/@William-Mou/HJuh7NC_B/%2F%40William-Mou%2FS1AgN4CCt)
- 組員間最好平時就在交流技術
- 約吃午餐
- 分享彼此看的資料
- 關注一下明年 2 ~ 3 月國網在中南部可能舉辦助教培訓營
- 套件很可能會有類似於`--help`的指令,這會給出很明確的編譯或使用資訊,或者可以不帶任何參數的空跑,也可能會給出使用說明。以及類似於`++debug`,可以開啟調適模式,這會不停地輸出目前的運行步驟。
- 先從自己電腦 VM 開始練,再研究組 cluster 方法
- 練架 Slurm, NFS, NIS, OpenMPI, ... 的多節點
- PC cluster 也可以
- 有志往 HPC 方向發展可進 [MVAPICH :: Users](https://mvapich.cse.ohio-state.edu/users/) 使用者列表中列出有 Taiwan 的研究單位/公司