<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      【Python】多GPU服務器自動選擇空閑GPU

      背景:

      有大量的GPU任務需要在多GPU服務器上執行,每個任務理論上僅使用單張GPU卡。在不依賴集群調度程序的基礎上,并考慮服務器其他用戶爭搶GPU資源的可能性,此代碼庫提供可以串行或并行地部署多GPU任務到多GPU卡、并動態的將隊列當中的等待任務前赴后繼地添加到隨時空閑出來的GPU上的解決方案。

      PS:目前僅能做到通過空余顯存數量來判斷GPU是否空閑。這樣做的原因是:長期的實踐經驗表明,GPU計算任務是否能將提交到GPU上受顯存的影響因素最大;即使GPU浮點計算使用率為百分之百,只要有足夠的顯存,任務還是可以提交上去;但是如果顯存不足,即使GPU浮點計算率為0,任務也提交不上去。

      源碼:

      https://github.com/wnm1503303791/Multi_GPU_Runner

      測試環境:

       

      代碼庫可解決的兩種情況:

      (1)我們僅需要執行一系列串行的GPU任務(一般適用于前后相關聯的一系列GPU計算任務):

      
      
      from manager import GPUManager
      gm=GPUManager()
      while(1):
          localtime = time.asctime( time.localtime(time.time()) )
          gpu_index = gm.choose_no_task_gpu()
          if gpu_index >= 0 :
              print('Mission Start Running @ %s'%(localtime));
      
              # gpu_index = 0
      
              cmd_1 = 'CUDA_VISIBLE_DEVICES=' + str(gpu_index) + ' ' + 'python ...'
              subprocess.call(cmd_1, shell=True)
      
              cmd_2 = 'python ...'
              subprocess.call(cmd_2, shell=True)
      
              break;
          else:
              print('Keep Looking @ %s'%(localtime),end = '\r')
              continue;
      
      print('Mission Complete ! Checking GPU Process Over ! ')

      原理很簡單,使用while循環持續探測GPU情況,只要有一個GPU被其他用戶的進程釋放,則立即將我們需要計算的任務部署到空閑的GPU上。串行完成所有計算任務之后打破循環,結束主進程。

       

      (2)有一系列GPU任務,任務之間不相關聯,可以動態地并行部署到多GPU卡上,目的是盡早結束所有GPU計算任務:

      from manager import GPUManager
      gm=GPUManager()
      
      mission_queue = []
      #for i in range(3):
      if(1):
          #以下的cmd_用于測試目的,真正使用的時候將字符串cmd_的內容換成自己需要執行的GPU任務命令即可
          cmd_ = 'python ./fizzbuzz.py > fizzbuzz_1'
          mission_queue.append(cmd_)
          cmd_ = 'python fizzbuzz.py > fizzbuzz_2'
          mission_queue.append(cmd_)
          cmd_ = 'python ./fizzbuzz.py > fizzbuzz_3'
          mission_queue.append(cmd_)
          cmd_ = 'python fizzbuzz.py > fizzbuzz_4'
          mission_queue.append(cmd_)
          cmd_ = 'python ./fizzbuzz.py > fizzbuzz_5'
          mission_queue.append(cmd_)
      
      p = []
      total = len(mission_queue)
      finished = 0
      running = 0
      
      while(finished + running < total):
          '''
          if len(mission_queue) <= 0 :
              break;
          '''
          localtime = time.asctime( time.localtime(time.time()) )
          gpu_av = gm.choose_no_task_gpu()
          # 在每輪epoch當中僅提交1個GPU計算任務
          if len(gpu_av) > 0 :
              gpu_index = random.sample(gpu_av, 1)[0]#為了保證服務器上所有GPU負載均衡,從所有空閑GPU當中隨機選擇一個執行本輪次的計算任務
              cmd_ = 'CUDA_VISIBLE_DEVICES=' + str(gpu_index) + ' ' + mission_queue.pop(0)#mission_queue當中的任務采用先進先出優先級策略
              print('Mission : %s\nRUN ON GPU : %d\nStarted @ %s\n'%(cmd_, gpu_index, localtime))
              # subprocess.call(cmd_, shell=True)
              p.append(subprocess.Popen(cmd_, shell=True))
              running += 1
              time.sleep(10)#等待NVIDIA CUDA代碼庫初始化并啟動
      
          else:#如果服務器上所有GPU都已經滿載則不提交GPU計算任務
              print('Keep Looking @ %s'%(localtime), end = '\r')
      
          new_p = []#用來存儲已經提交到GPU但是還沒結束計算的進程
          for i in range(len(p)):
              if p[i].poll() != None:
                  running -= 1
                  finished += 1
              else:
                  new_p.append(p[i])
      
          if len(new_p) == len(p):#此時說明已提交GPU的進程隊列當中沒有進程被執行完
              time.sleep(1)
          p = new_p
      
      for i in range(len(p)):#mission_queue隊列當中的所有GPU計算任務均已提交,等待GPU計算完畢結束主進程
          p[i].wait()
      
      print('Mission Complete ! Checking GPU Process Over ! ')

      隨時監測是否有GPU空閑,若有,則將任務添加上去,直至所有任務計算完畢。

       

      實驗結果:

       

      實驗結果表明可以達到我們的目的。

       

      參考和引用:

      1、https://github.com/QuantumLiu/tf_gpu_manager

      2、https://github.com/calico/basenji/blob/master/basenji/util.py

       

       

      tz@croplab, HZAU

      2020-9-16

      posted on 2020-09-16 15:48  tuzhuo  閱讀(2701)  評論(1)    收藏  舉報

      主站蜘蛛池模板: 蜜臀av日韩精品一区二区| 国产成人午夜精品影院| 亚洲一区二区三区影院| 色av专区无码影音先锋| 国产三级精品片| 精品免费看国产一区二区| 国产极品美女高潮无套| 高潮迭起av乳颜射后入| 国产精品推荐视频一区二区| 中文字幕无码免费久久9一区9| 色综合天天综合天天综| 色哟哟www网站入口成人学校| 精品91在线| 一区二区三区四区黄色网| 国产精品激情| 日本夜爽爽一区二区三区| 蜜桃av多人一区二区三区| 成人国产av精品免费网| 亚洲日本精品一区二区| 国产在线观看播放av| 久久99精品久久久久麻豆| 国产成人精品97| 国产精品自在自线免费观看| 国产精品亚洲第一区在线| 伊人精品无码av一区二区三区| 国产一区二区不卡91| 免费无码成人AV片在线| 乌拉特中旗| 熟女人妻精品一区二区视频| 日本在线a一区视频高清视频| 久久99精品国产麻豆宅宅| 成年女人片免费视频播放A| 深夜精品免费在线观看| 福利一区二区不卡国产| 精品精品亚洲高清a毛片| a在线观看视频在线播放| 成a人片亚洲日本久久| 日韩精品亚洲aⅴ在线影院| 亚洲一二区在线视频播放| 一区二区三区四区五区自拍| 人妻少妇偷人精品免费看|