GPU 環境で TensorFlow を構築し、単一の GPU を論理パーティションに分割する実践

1.環境を構築する

1.1. GPU バージョンの表示

tensorflow の GPU バージョンをインストールする前に、まずグラフィック カードを確認できます。
コマンド: nvidia-smi 

 

 または、デスクトップの右下隅の NVIDIA アイコンから、NVIDIA コントロール パネルに入ります。

左下隅のシステム情報をクリックし、コンポーネント内の NVCUDA64.dll のバージョンを表示します。

1.2. 新しい仮想環境の作成

myTFGPUと Python バージョン3.7という名前の仮想環境を作成します。これら 2 つは独自の環境に応じて指定されており、次のサイトにアクセスすることもできます: tensorflow-GPU バージョン独自のバージョンを選択してください
conda create -n myTFGPU python=3.7
を実行して、この仮想環境に入ります: myTFGPUをアクティブ化します

1.3. GPU バージョンで tensorflow をインストールする

コマンドをインストールしてDoubanミラーを導入した方がずっと早いです。

pip install tensorflow-gpu==2.9.0 -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com 

インストール後、機器を見てみましょう。

import tensorflow as tf
tf.test.gpu_device_name()
#Created device /device:GPU:0 with 1318 MB memory:  -> device: 0, name: NVIDIA GeForce GTX 1050, pci bus id: 0000:01:00.0, compute capability: 6.1
'/device:GPU:0'

GPU のモデル、サイズ、計算能力を確認できます。これらは正しく表示され、インストールが成功したことを示します。このマシンの物理 GPU と CPU を見てみましょう

# 查看gpu和cpu的数量
gpus = tf.config.experimental.list_physical_devices(device_type='GPU')
cpus = tf.config.experimental.list_physical_devices(device_type='CPU')
print(gpus, cpus)
#[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')] [PhysicalDevice(name='/physical_device:CPU:0', device_type='CPU')]

1.4、CUDA、cuDNNバージョン対応

 このうち、cudnn と cuda は既にインストールされているのでここでは省略します。

conda install -c conda-forge cudatoolkit=11.2 cudnn=8.1.0

もちろん、これら 2 つの対応するバージョンについては、コマンドconda search -f cudnn を 使用して対応するバージョンを表示し、バージョンの問題を回避できます。

(tensorflowGPU) C:\Users\Tony>conda search -f cudnn
Fetching package metadata .........
cudnn                        7.1.4                 cuda9.0_0  defaults
                             7.1.4                 cuda8.0_0  defaults
                             7.3.1                 cuda9.0_0  defaults
                             7.3.1                cuda10.0_0  defaults
                             7.6.0                cuda10.1_0  defaults
                             7.6.0                cuda10.0_0  defaults
                             7.6.0                 cuda9.0_0  defaults
                             7.6.4                cuda10.1_0  defaults
                             7.6.4                 cuda9.0_0  defaults
                             7.6.4                cuda10.0_0  defaults
                             7.6.5                 cuda9.0_0  defaults
                             7.6.5                cuda10.1_0  defaults
                             7.6.5                cuda10.0_0  defaults
                             7.6.5                cuda10.2_0  defaults
                             7.6.5                 cuda9.2_0  defaults
                             8.2.1                cuda11.3_0  defaults

1.5、CUDA および cuDNN のダウンロード

CUDA と cuDNN は比較的大きいため、より適切にダウンロードしてインストールすることをお勧めします。
CUDA ツールキット: https://developer.nvidia.com/cuda-toolkit-archive
cuDNN: https://developer.nvidia.com/rdp/cudnn-アーカイブ

インストール後、次のファイルを対応する場所にコピーします。

<インストールパス>\cuda\bin\cudnn*.dll をC:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.2\binコピーします
<インストールパス>\cuda\include\cudnn*.h をC:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.2\includeにコピーします<インストールパス>\cuda\lib\x64\cudnn*.libを C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.2\lib\x64
コピーします

インストール中に問題が発生した場合は、https: //blog.csdn.net/weixin_41896770/article/details/127444808を参照してください。

2. GPU論理パーティション

Windows のハードディスクは、C、D、E、F などの複数の論理ディスクに自由に分割できることがわかっています。同じ理由で、GPU もそのような設定を行うことができます。

import tensorflow as tf
gpus = tf.config.experimental.list_physical_devices('GPU')
#[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]

たとえば、私のコンピューターには GPU が 1 つしかなく、追加の GPU を使用せずにマルチ GPU テストを実行したい場合があります。しかし、良い点は、tensorflow などのフレームワークが分散をサポートし、GPU の論理分割もサポートしていることです。

#逻辑划分
tf.config.experimental.set_virtual_device_configuration(
     gpus[0],
     [tf.config.experimental.VirtualDeviceConfiguration(memory_limit=512),
      tf.config.experimental.VirtualDeviceConfiguration(memory_limit=512),
      tf.config.experimental.VirtualDeviceConfiguration(memory_limit=512)])
logical_gpus = tf.config.experimental.list_logical_devices('GPU')
#我们看下是否将GPU成功划分逻辑分区
print(logical_gpus)
#[LogicalDevice(name='/device:GPU:0', device_type='GPU'), LogicalDevice(name='/device:GPU:1', device_type='GPU'), LogicalDevice(name='/device:GPU:2', device_type='GPU')]

これを印刷すると、このマシンの 1 つの物理 GPU が 3 つの論理 GPU に分割されており、名前が/device:GPU:0/device:GPU:1/device:GPU:2であることがわかります。

他の実用的な方法については、print(dir(tf.config))を参照してください。

tf.debugging.set_log_device_placement(True)#打印一些变量在哪些设备
gpus = tf.config.experimental.list_physical_devices('GPU')#物理的GPU列表
tf.config.experimental.set_visible_devices(gpus[0], 'GPU')#设置GPU可见

以下に多くのメソッドがあり、興味のある方はその機能を理解することができます。 

['LogicalDevice', 'LogicalDeviceConfiguration', 'PhysicalDevice', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '_sys', 'experimental', 'experimental_connect_to_cluster', 'experimental_connect_to_host', 'experimental_functions_run_eagerly', 'experimental_run_functions_eagerly', 'functions_run_eagerly', 'get_logical_device_configuration', 'get_soft_device_placement', 'get_visible_devices', 'list_logical_devices', 'list_physical_devices', 'optimizer', 'run_functions_eagerly', 'set_logical_device_configuration', 'set_soft_device_placement', 'set_visible_devices', 'threading']

3. JupyterLab テスト

ここでは新しい環境を作成しているため、この仮想環境でアクティブ化した後、最初に
conda install -c conda-forge jupyterlab を
インストールし、次にコマンドjupyter lab
を入力して、JupyterLab でテスト用のコードを作成できるようにします。

この論理パーティションの GPU を実際にテストしてみましょう。

import tensorflow as tf

gpus = tf.config.experimental.list_physical_devices('GPU')
tf.config.experimental.set_virtual_device_configuration(
     gpus[0],
     [tf.config.experimental.VirtualDeviceConfiguration(memory_limit=512),
      tf.config.experimental.VirtualDeviceConfiguration(memory_limit=512),
      tf.config.experimental.VirtualDeviceConfiguration(memory_limit=512)])
logical_gpus = tf.config.experimental.list_logical_devices('GPU')

c = []
for gpu in logical_gpus:
    print(gpu.name)
    with tf.device(gpu.name):
        a = tf.constant([[1,2,3],[4,5,6]])
        b = tf.constant([[7,8],[9,10],[11,12]])
        c.append(tf.matmul(a, b))
print(c)
#将三块GPU计算的值,通过CPU计算相加
with tf.device('/cpu:0'):
    matmul_sum = tf.add_n(c)

print(matmul_sum)

'''
/device:GPU:0
/device:GPU:1
/device:GPU:2
[<tf.Tensor: shape=(2, 2), dtype=int32, numpy=
array([[ 58,  64],
       [139, 154]])>, <tf.Tensor: shape=(2, 2), dtype=int32, numpy=
array([[ 58,  64],
       [139, 154]])>, <tf.Tensor: shape=(2, 2), dtype=int32, numpy=
array([[ 58,  64],
       [139, 154]])>]
tf.Tensor(
[[174 192]
 [417 462]], shape=(2, 2), dtype=int32)
'''

行列の乗算計算が 3 つの論理 GPU で実行され、それらを CPU に割り当てて合計を計算することもできることがわかります。したがって、特定の GPU または CPU を使用する必要があり、with tf.device('GPU または CPU name') を使用して指定します。これは大規模なモデルで非常に実用的です。一般に、GPU のサイズは制限されていますが、大規模なモデルのパラメーターは非常に大きいため、異なる GPU を使用して異なるレイヤーを個別に計算できます。

おすすめ

転載: blog.csdn.net/weixin_41896770/article/details/131300130