我跑步訓練Keras / Tensorflow深度學習模型的集群(現在)2工人和1司機(T4 GPU 28 g 4核心)使用磚HorovodRunner提供。似乎一切順利,天平性能很好地在多個工人(不是完全線性但接近),增加彈性Horovod可以運行培訓現場vm降低價格。這似乎也工作。
培訓過程結束時出現的問題(在我的例子中,當錯誤沒有改善patience-number時代)和模型記錄Mlflow和其他人(還不錯)。不知為何,當函數要返回到HorovodRunner(關閉所有進程),部分出現問題。我得到以下堆棧跟蹤(部分):
(1,0)< stdout >:模型已經完成了培訓和數據打印出來。模型將會保存[1]< stdout >: 0530 - 132228 - e04hv44m - 10 - 139 - 64 - 4:1005:1020 [0] NCCL信息通訊0 x7fa0d8321f20等級1 nranks 2 cudaDev 0 busId 100000 -破壞完整(1,0)< stdout >: 0530 - 132228 - e04hv44m - 10 - 139 - 64 - 7:984:995 [0] NCCL信息通訊x7f33d45495b0等級0 nranks 2 cudaDev 0 busId 100000 -破壞完整[1]< stderr >: * * *的MPI_Query_thread()函數被稱為MPI_FINALIZE後調用。[1]< stderr >: * * *這是不允許的MPI標準。[1]< stderr >: * * *你的MPI工作現在將中止。[1]< stderr >: [0530 - 132228 - e04hv44m - 10 - 139 - 64 - 4:01005]當地中止MPI_FINALIZE開始成功完成後,但我不能總錯誤消息,並不能保證所有其他進程被殺!- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -主要工作正常終止,但1過程返回一個非零退出代碼。每user-direction工作已經中止。- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (1,0)< stderr >: 2023-05-30 13:36:43.867857: W tensorflow /核心內核/數據/ generator_dataset_op。答:108]敲定GeneratorDataset迭代器時發生錯誤:FAILED_PRECONDITION: Python解釋器狀態是沒有初始化。這個過程可能會終止。[1,0]< stderr >:[[{{節點PyFunc}}]] - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - mpirun檢測到一個或多個進程退出與非零狀態,從而導致工作被終止。 The first process to do so was: Process name: [[57229,1],1] Exit code: 1 --------------------------------------------------------------------------
的打印輸出”模式已經完成培訓…”表明,培訓不是問題,和模型保存在mlflow正確。
下麵的代碼是一個非常小的樣本我如何運行的一切。不幸的是,我無法提供更多的在這裏。由於公司的相關政策。它應該仍然顯示所有的相關部分問題:
def培訓(args, mlflow_runid use_horovod = False,時間= None):導入操作係統導入horovod.tensorflow。keras為hvd進口mlflow進口numpy np進口tensorflow進口tensorflow特遣部隊。數學從petastorm M tensorflow_addons作為組織導入從petastorm進口make_batch_reader。從tensorflow tf_utils從tensorflow進口進口make_petastorm_dataset總結。keras進口輸入模型中,回調,層,損失hvd.init () GPU = tf.config.list_physical_devices GPU在GPU (GPU): tf.config.experimental。set_memory_growth (gpu,真正的)如果gpu: tf.config.set_visible_devices (gpu (hvd.local_rank ()], gpu) = # keras模型優化器= hvd模型。DistributedOptimizer (tf.keras.optimizers.legacy.Adam (), backward_passes_per_step = 4, average_aggregated_gradients = True,) model.compile(優化器=優化器,損失= losses.MeanSquaredError(),指標= [euclidean_batch_error])與make_batch_reader (dataset_url_or_urls = train_dataset_reader_arguments_list [0], cache_type =“本地磁盤”)作為train_reader make_batch_reader (dataset_url_or_urls = val_dataset_reader_arguments_list [0], cache_type =“本地磁盤”)作為val_reader:打印(數據集讀者已定義)#在這裏我準備火車和驗證集數據(不是重要的問題train_dataset = prepare_dataset (dataset_reader = train_reader) training_steps_per_epoch =參數。train_df_size / / (args.batch_size) val_dataset = prepare_dataset (dataset_reader = val_reader) validation_steps_per_epoch =參數。val_df_size / / (args.test_batch_size)打印(“數據解析和批處理”)#https://sourcegraph.com/github.com/tensorflow/tensorflow@v2.4.1 / - /團/ tensorflow / python / keras / optim……模型。適合(train_dataset steps_per_epoch = 1,時代= 1,回調= None) = hvd.elastic狀態。KerasState(模型、批= 100 = 0)時代def on_state_reset():”“回調狀態時調用重置”“# state.model.optimizer.lr。tf.keras.backend分配(lr * hvd.size ())。set_value (state.model.optimizer。lr, lr * hvd.size state.model ())。適合(train_dataset steps_per_epoch = 1,時代= 1,回調= None) state.register_reset_callbacks horovod_callbacks = [hvd.elastic ([on_state_reset])。CommitStateCallback(狀態,batches_per_commit = 100), hvd.elastic.UpdateBatchStateCallback(狀態),hvd.elastic.UpdateEpochStateCallback(狀態)]all_callbacks = ((hvd.callbacks.MetricAverageCallback ()) + horovod_callbacks + [hvd.callbacks.BroadcastGlobalVariablesCallback (0)) + callbacks_list) @hvd.elastic.run def火車(狀態):噓= state.model。適合(train_dataset steps_per_epoch = training_steps_per_epoch時代=參數。n_epochs——狀態。時代,validation_data = val_dataset validation_steps = validation_steps_per_epoch,回調= all_callbacks verbose =冗長)返回狀態。模型,模型噓,噓=火車(狀態)打印(噓。曆史上“val_loss”[1],噓。曆史[“val_euclidean_batch_error”][1],)打印(“模型已經完成了培訓和數據打印出來。模型將得救”)# 0的排名是主節點,所以我們想要一個保存模型如果hvd.rank() = = 0:簽名= get_signature_mlflow mlflow.tensorflow (args, landmarks_shape)。log_model(模型參數。簽名=簽名,experiment_name conda_env = mlflow.spark.get_default_conda_env ()) hvd.shutdown()返回(噓。曆史上“val_loss”[1],噓。history["val_euclidean_batch_error"][-1], )
這是跑使用下麵的代碼:
hr = HorovodRunner (np = new_args。n_gpus driver_log_verbosity =“所有”)val_loss val_euclideandistance = hr.run(培訓、args = new_args mlflow_runid = active_run_uuid use_horovod =參數。use_horovod,)
這將是偉大的如果有人可以幫忙解決這個錯誤。隨意問更多的問題進一步縮小的問題。
我已經盡量不使用hvd.shutdown()函數,我也盡量不儲蓄模型在那個地方。我真的看起來在Horovod內部問題導致MPI_Query_thread()函數被稱為MPI_FINALIZE後由Horovod調用。期待收到你的!
你好,肖恩,謝謝你回到我和我道歉因為我的延遲反應。不幸的是,這些國家對彈性Horovod回調是必要的工作(https://horovod.readthedocs.io/en/stable/elastic_include.html),我想用因為它允許我使用vm,大大降低成本。
如果我用錯了或者有另一件事我應該做彈性Horovod horovodrunner一起工作,讓我知道,我要試一試!