[筆記] 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 使用率
:bulb: 輸入 top 指令後按下 1 就可以看到各個 cpu 目前使用情形


(按下 q 退出)

留言

這個網誌中的熱門文章

[筆記] CRLF跟LF之區別 --- 隱形的 bug

[ML筆記] Batch Normalization

[筆記] 統計實習(1) SAS 基礎用法 (匯入資料並另存SAS新檔,SUBSTR,計算總和與平均,BMI)

[ML筆記] Ensemble - Bagging, Boosting & Stacking