python - 在 Spark 中使用累积梯度进行分布式训练?
问题描述
我有一个在 SparkTF
中Keras
运行的自动编码器,目前该模型是在没有分布的驱动程序和完整数据集的一部分上本地训练的。
我想并行运行训练以加快过程并避免在整个数据集上出现 OOM。我的问题是,我只能在数据框上训练我的模型Pandas
。因此,有时会在驱动程序上收集数据。
def keras_autoencoder(trainning_data, testing_data, out_model):
# Prepare train and test data
train_data = trainning_data.dataframe().where(F.col("msn") == F.lit("50038"))
test_data = testing_data.dataframe().where(F.col("msn") == F.lit("50024"))
# Create Processing Stage turning df into list of tensor
column_transformer = Create_Tensor_EMA(outputCol="Input_Tensor", model_type="LSTM", column_order=column_order_EMA)
vectorizer = Stage(column_transformer)
training_df = vectorizer.transform(train_data)
test_df = vectorizer.transform(test_data)
Y = np.array(list(test_df.select('Input_Tensor').toPandas()['Input_Tensor']))
X = np.array(list(training_df.select('Input_Tensor').toPandas()['Input_Tensor']))
autoencoder = train_model(X, Y, EPOCHS, BATCH_SIZE, flight_len, param_len)
sequential_stage = Stage(KerasModelWrapper(autoencoder), input_column_names='Input_Tensor', output_column_names='predictions')
trainned_model = Model(vectorizer, sequential_stage)
trainned_model.save(out_model)
我正在考虑使用rdd
and MapPartitions
,因为我的数据已经按特定键进行了分区,因此可以将训练过程拆分到多个执行程序中。但我不希望每个执行者都在模型的单独实例上工作。
有没有办法使用gradient accumulation
:
- 让每个执行者在不更新权重的情况下训练一部分数据
- 将生成的梯度发送回驱动程序以更新模型的权重
- 将模型上的这个更新版本发回给执行器以处理下一批
解决方案
推荐阅读
- css - 是否可以仅在带有 CSS 的网格上将背景图像放在 amChart XY 图表中?
- machine-learning - 知道我有 9 个属性,我如何可视化我的数据集?
- android - 如何正确使用自定义视图位图?
- python - 创建图像缩略图失败并出现 TypeError: 'int' object is not subscriptable
- javascript - 在使用 JavaScript / HTML5 保存/上传之前在浏览器/客户端调整视频大小
- c++ - cout 打印内存地址而不是值
- jquery - Jquery – text() 中的 html?
- node.js - FetchError,原因:读取 ECONNRESET;从 node.js 将图像上传到谷歌云存储时
- c# - 从 contextMenuStrip 点击识别列表视图
- ti-nspire - 使用 TI-NSpire CX CAS 进行部分推导