總之,有一堆人超卷
營隊期間還有人沒睡覺一直卷,到底是尛
好啦,認真
這個營隊有讓我了解平行運算的基本觀念,以及其與 AI 的關聯性
還有學習簡單的 omp.h 跟 mpi.h 的函式使用
也讓我們玩一玩國網中心的超級電腦(創進一號)
老師跟助教講解的都很清楚,有問題也可以得到易懂的解答
食物的話,第一天的薄皮披薩很好吃,但其他時間就需要自己去覓食了
營隊準備的飯店就是方便省錢,如果有人很注重這方面的品質,就需要自己處理了
如果想要開拓視野的話,這個營隊會是不錯的選擇
btw 營隊結束後我揹著背包跟提著行李走了清大跟交大一圈,累死
活動資訊詳情請見活動官網
聽說暑期營隊還會多教怎麼玩 GPU
活動筆記#
邊上課邊隨手寫的
很碎片也很不詳細
如果我接收到的資訊是錯誤的也請麻煩糾正
What is the difference between ML, DL & AI?#
- ML (Machine Learning): 機器自己依照數據的規律學習
- DL (Deep Learning): 機器依照人工完成的算法學習
- AI (Artificial Intelligence): 電腦模仿人類智慧解決問題等的技術
What deep learning demands increasing computing power?#
深度學習需要 Data、Compute、Module
其往往受限於大規模的 Compute 導致資源消耗過多或是設備成本過高
What is HPC, Supercomputer, TOP500?#
HPC (High performance Compute): 高性能運算,為了解決在科學、工程、商業等領域的大型問題,所產生的解決方案,擁有遠超單一般設備的性能表現
Supercomputer: 超級電腦,由多個節點所組成
TOP500: 超級電腦的排行榜,依據 HPL Benchmark 跑分進行排名。因現今大多超級電腦為商用,不對外公開其機器規格、跑分,所以目前排行榜上的超級電腦多為公家機關所持有
Rpeak: 理論值
Rmax: 實際分數
How to measure performance (FLOPs, TTFT, TPOT)?#
FLOPs (Floating-point operations per seconds): 每秒計算浮點數的運算次數
TTFT (Time to first token latency): 第一個 token 產生花費的時間
TPOT (Time per output token): Token 之間產生所花費的時間
Why benchmark is important?#
以一個符合使用者需求所訂製的評分表,可以讓使用者依照各個機器的跑分來了解該機器的性能表現
Flynn 分類法#
- SISD
- SIMD
- MISD
- MIMD
S: MingleM: MultipleI: InstructionD: Data
AI chips (AI 晶片)#
對 AI 製作客製化的晶片
以達到低耗能、體積小、高效能
但是開發難度上升
包括:GPU、FPGA、ASIC
Data Transfer Bottleneck#
資料傳輸是在平行計算架構最為重要的一環
InfiniBand 為高速網路,高頻寬低延遲的技術
*使用 HCA,其支援的 RDMA 可以略過 CPU 進行記憶體數據傳輸
NV-Link Fabric: GPU 之間的傳輸協議
AI Superchip#
單一晶片內含 CPU 和 GPU,因為其存在於單一晶片,使其傳輸速率大幅提升
其中的 CPU 和 GPU 本質與普通的晶片並無區別
APU#
CPU 和 GPU 共用同一塊記憶體,不受資料傳輸頻寬等限制
module#
快速更改環境變數,易於切換不同工作
ml avail 查看可用模組
ml add <tool> 套用模組
ml load <tool> 加載模組
#%module
slurm#
sbatch job.sh
squeue
scancel
Parallel Odd-Even Sort#
所有單數與右邊比較,再所有雙數與右邊比較
n 長度的數列在比較 n 次後排序完成
所有單數和所有雙數各可平行處理
Load Balacing#
使各處理量平均
Race Condition#
平行化有可能導致結果錯誤
a thread 尚未將結果存回 var 時 b thread 就取用 var
導致 b thread 沒有取用到 a thread 的結果
可以在 #pragma omp parallel for 後面加上 reduction(+:var) 使其變數在 thread 裡為私有
平行處理結束後,會將 var 合併,以解決 race condition
Data Dependency#
在平行處理需要考慮到資料相依性
Ex. c 的執行需要 a 和 b 處理完為前置
for (int i = 0; i < 10; i++) a[i] = a[i-1] + 5;
Process & Thread#
Program load -> Process
Part of process -> Thread
Thread 共用 Process 的 code、data 等
OpenMP#
將多行程式碼或多層迴圈使用 Threads 攤平
Pragma 編譯指示詞:
#include <omp.h>
//匯入 omp 函式庫
#pragma omp parallel
//指定一個平行區域,這個區域內的程式碼會被多個 threads 同時執行
#pragma omp parallel num_threads( )
//明確指定要創建多少個threads來執行平行區域
#pragma omp for
//用於平行化迴圈,會將迴圈的迭代次數分配給不同的 thread
#pragma omp schedule( )
//指定迴圈迭代的調度方式,決定如何將迴圈的工作分配給 thread
#pragma omp collapse( )
//將多層巢狀迴圈合併成單一迴圈來進行平行化
在編譯時要加上 -fopenmp
MPI#
全名是Message Passing Interface
一個函式庫用來處理資料傳輸
以下是一些基礎語法
#include <mpi.h>
//匯入 MPI 函式庫
MPI_Init();
//初始化 MPI 環境
MPI_Comm_rank();
//取得 process 在 MPI communicator 的編號
MPI_Comm_size();
//取得在指定的 MPI communicator 的 process 數量
MPI_Send();
//傳送資料到不同的 process,資料傳送完成後才會執行接下來的程式碼
MPI_Recv();
//接收傳送過來的資料,資料接收完成後才會執行接下來的程式碼
MPI_Isend();
//傳送資料,但不進行等待
MPI_Irecv();
//接收資料,但不進行等待
MPI_File_open();
//開啟檔案,且多個 process 可以同時對檔案進行讀取或寫入
MPI_File_read_at();
//讀取檔案內容
MPI_File_write_at();
//將內容寫入檔案
MPI_File_close();
//關閉先前開啟的檔案
MPI_Wtime();
//回傳處理器上經過的時間,單位為秒
MPI_Finalize();
//關閉 MPI 環境,程式仍會繼續執行接下來的程式碼,但不能再呼叫任何的 MPI 函式,也不能再次重啟 MPI 環境
實際參數該放什麼,自己上網查
我也是查來的 :D
*要用 mpicc 來編譯、mpirun 來執行
VTune Profiler#
一款效能分析工具
裡面的內容大多我都不知道在表達什麼
