[Tensorflow2.0]単一のGPUを使用してモデルをトレーニングする

ディープラーニングのトレーニングプロセスは、多くの場合非常に時間がかかります。モデルを数時間トレーニングすることは一般的です。数日間のトレーニングも一般的です。時には数十日かかることもあります。

時間のかかるトレーニングプロセスは、主に2つの部分から成り、1つはデータの準備から、もう1つはパラメーターの反復から生じます。

データ準備プロセスがモデルトレーニング時間の主なボトルネックである場合、より多くのプロセスを使用してデータを準備できます。

パラメータ反復プロセスがトレーニング時間の主なボトルネックになる場合、通常の方法はGPUまたはGoogleのTPUを使用して加速します。

詳細については、「GPU-Colabを使用したKerasモデルの高速化-無料のGPU使用ガイド」を参照してください

https://zhuanlan.zhihu.com/p/68509398

組み込みのフィット法でもカスタムトレーニングループでも、コードを変更せずにCPUから単一のGPUトレーニングモデルに切り替えると非常に便利です。GPUが使用可能な場合、デバイスを指定しないと、tensorflowは自動的にGPUを使用してテンソルを作成し、テンソル計算を実行します。

ただし、会社または学校の実験室のサーバー環境で、複数のGPUと複数のユーザーがいる場合、単一のクラスメートのタスクがすべてのGPUリソ​​ースを占有できないようにするため、他のクラスメートはそれを使用できません(tensorflowのデフォルトではすべてのGPUメモリリソースを取得します)アクセス許可ですが、実際には1つのGPUのリソースの一部のみを使用します)。通常、次のコード行を最初に追加して、各タスクで使用されるGPU数とメモリサイズを制御します。これにより、他の学生も同時にモデルをトレーニングできます。

Colabノートブック:変更->ノートブック設定->ハードウェアアクセラレータでGPUを選択

注:次のコードは、Colabでのみ正しく実行できます。

次のcolabリンクを使用して、「tf_single GPU」の効果をテストできます。

https://colab.research.google.com/drive/1r5dLoeJq5z01sU72BX2M5UiNSkuxsEFe

%tensorflow_version 2 .x tensorflow.keras
 import からtf
 print(tf 。__version__ としてテンソルフローをインポートする * 打印时间分割线@ tf.function
 def printbar():
    ts = tf.timestamp()
    today_ts = ts%(24 * 60 * 60 
    時間 = tf.cast(today_ts // 3600 + 8、tf.int32)%tf.constant(24 
    minite = tf.cast((today_ts%3600)// 60 、tf.int32) = tf cast(tf.floor(today_ts%60 )、tf.int32)def timeformat(m):
         if
 


 
 
    tf.strings.length(tf.strings.format(" {} "、m))== 1 return(tf.strings.format(" 0 {} " 、m))
         else return(tf.strings.format (" {} " 、m))
 
    timestring = tf.strings.join([timeformat(hour)、timeformat(minite)、
                timeformat(second)]、separator = " " 
    tf。印刷" ========== " * 8、end = "" 
    tf。(タイムストリング)

2.2.0-rc2

1つは、GPU設定

= tf.config.list_physical_devicesのGPU(" GPU " 
 
IF のGPU:
    GPUO = GPUを[0] 複数GPUのみ0番目のGPUがある場合 
    tf.config.experimental.set_memory_growth(GPUO、TRUE) セットGPUメモリオンデマンドの量
    :またはGPUメモリは、固定量(4Gなど)として提供されてもよい
    #1 (GPUO、tf.config.experimental.set_virtual_device_configuration 
        [tf.config.experimental.VirtualDeviceConfiguration(のmemory_limit = 4096)]) 
    tf.config .set_visible_devices([GPUO]、" GPU " CPU及びGPUの比較計算速度

プリントバー()
tf.device有する(" / GPU:0 "):
    tf.random.set_seed(0)
    a = tf.random.uniform((10000,100)、minval = 0、maxval = 3.0 
    b = tf.random.uniform((100,100000)、minval = 0、 maxval = 3.0 
    c = a @ b 
    tf。print(tf.reduce_sum(tf.reduce_sum(c、axis = 0)、axis = 0))
printbar()

printbar()
with tf.device(" / cpu:0 " ):
    tf.random.set_seed(0)
    a = tf.random.uniform((10000,100)、minval = 0、maxval = 3.0 
    b = tf.random.uniform((100,100000)、minval = 0、maxval = 3.0 
    c = a @ b
    tf。印刷(tf.reduce_sum(tf.reduce_sum(c、axis = 0)、axis = 0))
printbar()
================================================== ============================== 11:59:21 
2.24953778e + 11 
=========== ================================================== =================== 11:59:23 
========================== ================================================== ==== 11:59:23 
2.24953795e + 11 
===================================== =========================================== 11:59:29

次に、データを準備します

MAX_LEN = 300 
BATCH_SIZE = 32 
(x_train、y_train)、(x_test、y_test) = datasets.reuters.load_data()
x_train = preprocessing.sequence.pad_sequences(x_train、maxlen = MAX_LEN)
x_test = preprocessing.sequence.pad_sequences(x_test = MAX_LEN)
 
MAX_WORDS = x_train.max()+ 1 
CAT_NUM = y_train.max()+ 1 
 
ds_train = tf.data.Dataset.from_tensor_slices((x_train、y_train))\ 
          .shuffle(buffer_size = 1000 ).batch(BATCH_SIZE) \ 
          .prefetch(tf.data.experimental.AUTOTUNE).cache()
 
ds_test =tf.data.Dataset.from_tensor_slices((x_test、y_test))\ 
          .shuffle(buffer_size = 1000 ).batch(BATCH_SIZE)\ 
          .prefetch(tf.data.experimental.AUTOTUNE).cache()

3、モデルを定義する

tf.keras.backend.clear_session()
 
def create_model():
 
    model = models.Sequential()
 
    model.add(layers.Embedding(MAX_WORDS、 7、input_length = MAX_LEN))
    model.add(layers.Conv1D(filters = 64、 kernel_size = 5、activation = " relu " ))
    model.add(layers.MaxPool1D( 2 ))
    model.add(layers.Conv1D(filters = 32、kernel_size = 3、activation = " relu " ))
    model.add(layers .MaxPool1D( 2 ))
    model.add(layers.Flatten())
    model.add(layers.Dense(CAT_NUM、activation =" softmax " ))
     return (model)
 
model = create_model()
model.summary()
モデル:順次
_________________________________________________________________ 
レイヤー(タイプ)出力形状パラメーター    
===================================== ============================= 
埋め込み(埋め込み)(なし、 300、7)216874    
 _________________________________________________________________ 
conv1d(Conv1D)(なし、 296 、64)2304      
 _________________________________________________________________ 
max_pooling1d(MaxPooling1D)(なし、 148、64 )0         
 _________________________________________________________________
conv1d_1(Conv1D)(なし、 146、32)6176      
 _________________________________________________________________ 
max_pooling1d_1(MaxPooling1(なし、 73、32 )0         
 _________________________________________________________________ 
平坦化(平坦化)(なし、 2336 )0         
 _________________________________________________________________ 
緻密(高密度)(なし、 46)107502     
==== ================================================== =========== 
合計パラメータ 332,856トレーニング
可能なパラメータ 332,856  -トレーニング可能なパラメータ:0
 _________________________________________________________________

第四に、トレーニングモデル

optimizer = optimizers.Nadam()
loss_func = loss.SparseCategoricalCrossentropy()
 
train_loss = metrics.Mean(name = ' train_loss ' 
train_metric = metrics.SparseCategoricalAccuracy(name = ' train_accuracy ' 
 
valid_loss = metrics.Mean(name = ' valid_loss ' 
valid_metric = metrics.SparseCategoricalAccuracy(name = ' valid_accuracy ' 
 
@ tf.function 
def train_step(model、features、labels): 
    with tf.GradientTape()as tape:
        予測 = model(features、training =True)
        損失 = loss_func(ラベル、予測)
    勾配 = tape.gradient(損失、モデル.trainable_variables)
    optimizer.apply_gradients(zip(gradients、モデル.trainable_variables))
 
    train_loss.update_state(損失)
    train_metric.update_state(ラベル、予測)
 
@ tf.function 
def valid_step(model、features、labels):
    予測 = モデル(機能)
    batch_loss = loss_func(labels、予測)
    valid_loss.update_state(batch_loss)
    valid_metric.update_state(labels、予測)
 
 
deftrain_model(モデル、ds_train、ds_valid、エポック)
     のためのエポックにおける tf.range(1、エポック+ 1 
 
        のための機能、ラベル:ds_train 
            train_step(モデル、機能、ラベル)
 
        のための機能、ラベルds_valid:
            valid_step(モデル、features、labels)
 
        logs = ' Epoch = {}、Loss:{}、Accuracy:{}、Valid Loss:{}、Valid Accuracy:{} ' 
 
        if epoch%1 == 0:
            printbar()
            tf。print (tf.strings.format(logs、
            (epoch、train_loss.result()、train_metric.result()、valid_loss.result()、valid_metric.result())))
            tf。print"" 
 
        train_loss.reset_states()
        valid_loss.reset_states()
        train_metric.reset_states()
        valid_metric.reset_states()
 
train_model(model、ds_train、ds_test、 10)
================================================== ============================== 12:01:11 
エポック = 1、損失:2.00887108、精度:0.470273882、有効損失: 1.6704694、有効な精度:0.566340148 

============================================= ==================================== 12:01:13 
エポック = 2、損失:1.47044504、精度:0.618681788、有効損失:1.51738906、有効精度:0.630454123 

======================================= ========================================== 12:01:14 
エポック = 3 、損失:1.1620506、精度:0.700289488、有効損失:1.52190566、有効精度:0.641139805 

================================= ================================================ 12: 01:16 
エポック= 4、損失:0.878907442、精度:0.771654427、有効損失:1.67911685、有効精度:0.644256473 

============================== ================================================== 12:01:17 
エポック = 5、損失:0.647668123、精度:0.836450696、有効損失:1.93839979、有効精度:0.642475486 

======================== ================================================== ====== 12:01:19 
エポック = 6、損失:0.487838209、精度:0.880538881、有効損失:2.20062685、有効精度:0.642030299 

================== ================================================== ============ 12:01:21 
エポック = 7、損失:0.390418053、精度:0.90670228、有効損失:2.32795334、有効精度:0.646482646

================================================== ============================== 12:01:22 
エポック = 8、損失:0.328294098、精度:0.92351371、有効損失: 2.44113493、有効な精度:0.644701719 

============================================ ==================================== 12:01:24 
エポック = 9、損失:0.286735713、精度:0.931195736、有効損失:2.5071857、有効精度:0.642920732 

======================================= ========================================== 12:01:25 
エポック = 10 、損失:0.256434649、精度:0.936428428、有効損失:2.60177088、有効精度:0.640249312

参照:

オープンソースの電子書籍アドレス:https://lyhue1991.github.io/eat_tensorflow2_in_30_days/

GitHubプロジェクトのアドレス:https://github.com/lyhue1991/eat_tensorflow2_in_30_days

おすすめ

転載: www.cnblogs.com/xiximayou/p/12690628.html