python訓練時指定gpu的簡單介紹

本文目錄一覽:

pytorch用什麼顯卡

1. 利用CUDA_VISIBLE_DEVICES設置可用顯卡

在CUDA中設定可用顯卡,一般有2種方式:

(1) 在代碼中直接指定

import os

os.environ[‘CUDA_VISIBLE_DEVICES’] = gpu_ids

(2) 在命令行中執行代碼時指定

CUDA_VISIBLE_DEVICES=gpu_ids python3 train.py

如果使用sh腳本文件運行代碼,則有3種方式可以設置

(3) 在命令行中執行腳本文件時指定:

CUDA_VISIBLE_DEVICES=gpu_ids sh run.sh

(4) 在sh腳本中指定:

source bashrc

export CUDA_VISIBLE_DEVICES=gpu_ids python3 train.py

(5) 在sh腳本中指定

source bashrc

CUDA_VISIBLE_DEVICES=gpu_ids python3 train.py

如果同時使用多個設定可用顯卡的指令,比如

source bashrc

export CUDA_VISIBLE_DEVICES=gpu_id1 CUDA_VISIBLE_DEVICES=gpu_id2 python3 train.py

那麼高優先級的指令會覆蓋第優先級的指令使其失效。優先級順序為:不使用sh腳本 (1)(2); 使用sh腳本(1)(5)(4)(3)

個人感覺在煉丹時建議大家從(2)(3)(4)(5)中選擇一個指定可用顯卡,不要重複指定以防造成代碼的混亂。方法(1)雖然優先級最高,但是需要修改源代碼,所以不建議使用。

2 .cuda()方法和torch.cuda.set_device()

我們還可以使用.cuda()[包括model.cuda()/loss.cuda()/tensor.cuda()]方法和torch.cuda.set_device()來把模型和數據加載到對應的gpu上。

(1) .cuda()

以model.cuda()為例,加載方法為:

model.cuda(gpu_id) # gpu_id為int類型變量,只能指定一張顯卡

model.cuda(‘cuda:’+str(gpu_ids)) #輸入參數為str類型,可指定多張顯卡

model.cuda(‘cuda:1,2’) #指定多張顯卡的一個示例

(2) torch.cuda.set_device()

使用torch.cuda.set_device()可以更方便地將模型和數據加載到對應GPU上, 直接定義模型之前加入一行代碼即可

torch.cuda.set_device(gpu_id) #單卡

torch.cuda.set_device(‘cuda:’+str(gpu_ids)) #可指定多卡

但是這種寫法的優先級低,如果model.cuda()中指定了參數,那麼torch.cuda.set_device()會失效,而且pytorch的官方文檔中明確說明,不建議用戶使用該方法。

第1節和第2節所說的方法同時使用是並不會衝突,而是會疊加。比如在運行代碼時使用

CUDA_VISIBLE_DEVICES=2,3,4,5 python3 train.py

而在代碼內部又指定

model.cuda(1)

loss.cuda(1)

tensor.cuda(1)

那麼代碼會在GPU3上運行。原理是CUDA_VISIBLE_DEVICES使得只有GPU2,3,4,5可見,那麼這4張顯卡,程序就會把它們看成GPU0,1,2,3,.cuda(1)把模型/loss/數據都加載到了程序所以為的GPU1上,則實際使用的顯卡是GPU3。

如果利用.cuda()或torch.cuda.set_device()把模型加載到多個顯卡上,而實際上只使用一張顯卡運行程序的話,那麼程序會把模型加載到第一個顯卡上,比如如果在代碼中指定了

model.cuda(‘cuda:2,1’)

在運行代碼時使用

CUDA_VISIBLE_DEVICES=2,3,4,5 python3 train.py

這一指令,那麼程序最終會在GPU4上運行。

3.多卡數據並行torch.nn.DataParallel

多卡數據並行一般使用

torch.nn.DataParallel(model,device_ids)

其中model是需要運行的模型,device_ids指定部署模型的顯卡,數據類型是list

device_ids中的第一個GPU(即device_ids[0])和model.cuda()或torch.cuda.set_device()中的第一個GPU序號應保持一致,否則會報錯。此外如果兩者的第一個GPU序號都不是0,比如設置為:

model=torch.nn.DataParallel(model,device_ids=[2,3])

model.cuda(2)

那麼程序可以在GPU2和GPU3上正常運行,但是還會佔用GPU0的一部分顯存(大約500M左右),這是由於pytorch本身的bug導致的(截止1.4.0,沒有修復這個bug)。

device_ids的默認值是使用可見的GPU,不設置model.cuda()或torch.cuda.set_device()等效於設置了model.cuda(0)

4. 多卡多線程並行torch.nn.parallel.DistributedDataParallel

(這個我是真的沒有搞懂,,,,)

參考了這篇文章和這個代碼,關於GPU的指定,多卡多線程中有2個地方需要設置

torch.cuda.set_device(args.local_rank)

torch.nn.parallel.DistributedDataParallel(model, device_ids=[args.local_rank])

模型/loss/tensor設置為.cuda()或.cuda(args.local_rank)均可,不影響正常運行。

5. 推薦設置方式:

(1) 單卡

使用CUDA_VISIBLE_DEVICES指定GPU,不要使用torch.cuda.set_device(),不要給.cuda()賦值。

(2) 多卡數據並行

直接指定CUDA_VISIBLE_DEVICES,通過調整可見顯卡的順序指定加載模型對應的GPU,不要使用torch.cuda.set_device(),不要給.cuda()賦值,不要給torch.nn.DataParallel中的device_ids賦值。比如想在GPU1,2,3中運行,其中GPU2是存放模型的顯卡,那麼直接設置

CUDA_VISIBLE_DEVICES=2,1,3

(3) 多卡多線程

使用python在GPU上構建和訓練卷積神經網絡

我將對代碼進行補充演練,以構建在數據集上訓練的任何類型的圖像分類器。在這個例子中,我將使用花卉數據集,其中包括102種不同類型的花。需要數據集和代碼都可以私信我。

Pytorch是機器學習和Python上的免費軟件包,非常易於使用。語法模擬numpy,因此,如果你在python中有一些科學計算經驗,那麼會相當有用的。只需幾行代碼,就可以下載預先訓練的數據集,使用定義的變換對圖像進行標準化,然後運行訓練。

創建和擴充數據集

為了增加數據集,我使用’ google_images_download’API 從互聯網上下載了相關圖像。顯然,您可以使用此API不僅可以擴充現有數據集,還可以從頭開始創建自己的數據集。

確保從圖像中挑選出異常值(損壞的文件或偶然出現的無關圖像)。

圖像標準化

為了使圖像具有相同的大小和像素變化,可以使用pytorch的transfors模塊:

轉移學習

從頭開始訓練的模型可能不是最明智的選擇,因為有許多網絡可用於各種數據集。簡單地說,像edge-和其他簡單形狀檢測器等低級特徵對於不同的模型是相似的,即使clasificators是針對不同目的進行訓練的。在本項目中,我使用了一個預訓練網絡Resnet152,只有最後一個完全連接的層重新用於新任務,即使這樣也會產生相當好的效果。

在這裡,我將除最後一層之外的所有層都設置為具有固定權重(requires_grad = False),因此只有最後層中的參數將通過梯度下降進行更新。

訓練模型

下面介紹一下進行訓練的函數:

如何獲得GPU?

當然,對CPU的訓練太慢了。根據我自己的經驗,在GPU僅需要一個小時就可以完成12次訓練周期,但是在CPU上相同數量的訓練周期可能需要花費大約15個小時。

如果您沒有本地可用的GPU,則可以考慮使用雲GPU。為了加速CNN的訓練,我使用了floydhub()上提供的雲GPU 。

這項服務非常指的使用:總有很好的文檔和大量的提示,所以你會很清楚的知道下一步需要如何去做。在floydhub上對於使用GPU的收費也是可以接受的。

首先,需要將數據集上傳到服務器

然後,需要創建項目。需要在計算機上安裝floydhub客戶端,將數據集上載到其網站並在終端中運行以下命令:

其中’username’是您的登錄名,’i’是數據集所在的文件夾。

這樣子在訓練網絡時就會很輕鬆了

結果和改進想法

得到的模型在數據集上訓練了1.5小時,並在驗證數據集上達到了95%的準確度。

caffe python代碼怎麼用 gpu運行

編譯和安裝Caffe 。。。但我在編譯caffe時 輸入make all 指令時報錯 :提示找不到hdf5.h 我百度後 按照這個解決了。這樣make all 成功 make test也成功 make runtest也成功。 再開始其第3步:增加python支持這步 開始我看不清 就從這裡開始參考: 編譯python時: make pycaffe報錯:找不到arrayobject.h 解決辦法:sudo apt-get install python-numpy 這樣就解決了。這樣第3步的幾條指令均成功。再開始第4步 第4.2步報錯說:pip 找不到指令 於是我在終端輸入sudo apt-get install python-pip即解決了。 接着執行4.2步 第一個ipython[all]裝時失敗了 我就先裝後面的幾個 有的成功 有的失敗 失敗的是protobuf和skimage 解決辦法是:自己

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/242222.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 12:47
下一篇 2024-12-12 12:47

相關推薦

  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智能、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29

發表回復

登錄後才能評論