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