快轉到主要內容

HPC x AI Winter Camp 心得

目錄

總之,有一堆人超卷
營隊期間還有人沒睡覺一直卷,到底是尛

好啦,認真
這個營隊有讓我了解平行運算的基本觀念,以及其與 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: Mingle
M: Multiple
I: Instruction
D: 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
#

一款效能分析工具
裡面的內容大多我都不知道在表達什麼

Piau 的筆記本
作者
Piau 的筆記本
希望我寫下來的東西能夠長久的記在我的腦中