[筆記] Python multi-process task in Docker Container
Python multi-process task in Docker Container
container setting
啟動 container 時要做一些設定
假設我的機器有個 8 核心 CPU,以及多張 GPU
要讓 container 使用全部運算資源的話可以這樣設定
docker run --gpus all --cpus 8 --cpuset-cpus 0-7  (後略...)
參數設定
- --cpuset-cpus 0-7- 8 核心的 cpu 編號從 0 開始到 7
- 如果想指定 cpu 特定某幾個核心的話可以這樣改:--cpuset-cpus 0,7使用第一個跟最後一個核心--cpuset-cpus 0,2,4,6使用第 1,3,5,7 個核心
 
ref: https://docs.docker.com/config/containers/resource_constraints/
python 使用 multiprocessing
查看 cpu 核心數
import multiprocessing
cpus = multiprocessing.cpu_count()
print(cpus) # 8
假設我們有個任務名稱叫做 sleep_task,執行每個運算時都會睡一秒
如果數據量超大,使用單個核心會等到天荒地老
import time
# task 內容: 睡一秒後再做放大兩倍的運算
def sleep_task(input_list):
    res = []
    for x in input_list:
        time.sleep(1)
        res.append(x*2)
    return res
if __name__ == '__main__':
    # Single-process start
    start_time = time.time()    
    input_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
    sp_result = sleep_task(input_list)  
    # Single-process result
    print('sp_result', sp_result)
    # 因為 input_list 有 16 個元素,每個元素運算需要 1 秒,所以大概會花 16 秒左右
    print('sp_result time cost:', time.time()-start_time) 
    
    # Multi-process start
    start_time = time.time()
    p = multiprocessing.Pool()
    
    results = []
    for i in range(8):  # 使用 8 核心 cpu
        # 欲使每個核心分別處理 input_list 當中的 2 個資料
        # 可以手動將資料切成小塊透過 args 送進去 sleep_task
        result = p.apply_async(sleep_task, args=(input_list[i*2:(i+1)*2], )) 
        results.append(result)
        
    p.close()
    
    mp_result = [] 
    for r in results:
        mp_result += r.get()
        
    # Multi-process result
    print('mp_result', mp_result)
    # 因為 input_list 有 16 個元素,每個元素運算需要 1 秒,但分給 8 個核心去願算,所以大概會花 2 秒左右
    print('mp_result time cost', time.time()-start_time)
執行結果
使用同樣的步驟,在 12 核心機器上執行任務
可以用 top 指令監看各個 cpu 使用率 輸入 top 指令後按下 1 就可以看到各個 cpu 目前使用情形
 輸入 top 指令後按下 1 就可以看到各個 cpu 目前使用情形

(按下 q 退出)

 
 
 
留言
張貼留言