tensorflow深度学习两种学习模式MirroredStrateg,MultiWorkerMirroredStrategy进行对比-- 实际案例《针对玩家一段时间表现识别是否为脚本玩家》

服务器背景

一台16核64g(数据存储机,命名tensor101)
一台4核16g(命名tensor102)

案例背景

针对某款手游,观察玩家在7天内的行为,包括在副本,经验,金币,市场等各个方面的表现识别这个玩家是否是脚本玩家。

单机模式

训练数据量:716392, 7, 18
测试数据量:182158, 7, 18
本例采用的是LSTM 模型。
epochs = 5 # 总轮次
batch_size = 1024 # 单次训练batch
num_workers = 1 # 机器个数
sequence_length = 7 # 样本时间步长

def get_strategy():
    """
    单机模式
    :return:
    """
    import tensorflow as tf
    strategy = tf.distribute.MirroredStrategy()
    return strategy

单机模式下的参数

epochs = 5
batch_size = 1024   # 单次训练batch
num_workers = 1   # 机器个数
sequence_length = 7  # 样本时间步长
strategy = get_strategy()
# strategy = get_multi_strategy()
data = get_data()
c_data = clean_data(data, sequence_length)
test_x, test_s_x,test_y = c_data[3:]
train_datasets, test_datasets, steps_per_epoch_size, test_steps = create_dataset(batch_size,num_workers,c_data)
print("steps_per_epoch_size,test_steps:",steps_per_epoch_size,test_steps)
with strategy.scope():
    model = build_and_compile_cnn_model()
print('start fit model')
from time import time
start = time()
history = model.fit(train_datasets, epochs=epochs,steps_per_epoch=steps_per_epoch_size,shuffle=True,class_weight={1:4,0:1},
                   validation_data=test_datasets,validation_steps=test_steps)
print('Time: {:5.2f}s'.format(time() - start))

训练过程

打开服务器tensor101 的 top 可以看到在单机模式下也只有一个进程在进行运算
在这里插入图片描述

训练结果

tensorflow深度学习两种学习模式MirroredStrateg,MultiWorkerMirroredStrategy进行对比-- 实际案例《针对玩家一段时间表现识别是否为脚本玩家》_第1张图片
可以看到整个模型的参数有44w个,每轮训练大概用时100秒,总体训练5轮用时528s。
时间有限做例子我只训练了5轮,结果对于脚本玩家的识别准确率达到98%。

多机多卡模式

训练数据量:720773, 7, 18
测试数据量:177777, 7, 18
本例采用的是LSTM 模型。
epochs = 5 # 总轮次
batch_size = 256 # 每个机器单次训练batch
num_workers = 4 # 机器个数(tensor101 开 3个端口)
sequence_length = 7 # 样本时间步长

注:若在分布式集群中有一台未启动则所有的集群都不会进行迭代,另外一定要保持迭代次数相同。
在构建分布式的模型中,由于tensorflow的分布式接口还不完善,存在某些函数用不了的情况,如优化器的选择之类的。
def get_multi_strategy():
    """
    分布式模式
    :return:
    """
    import tensorflow as tf
    import argparse
    import os
    import json
    parser = argparse.ArgumentParser(description='tensorflow_test')
    parser.add_argument('-worker', default=0)  # --work_num
    args, unknown_args = parser.parse_known_args()

    HOST_CONFIG = ["tensor101:20000","tensor101:20001","tensor101:20002","tensor102:20000"]
    os.environ['TF_CONFIG'] = json.dumps({
        'cluster': {
            'worker': HOST_CONFIG
        },
        'task': {'type': 'worker', 'index': args.worker}
    })

    print (os.environ['TF_CONFIG'])
    strategy = tf.distribute.experimental.MultiWorkerMirroredStrategy()
    return strategy

多机多卡模式的参数
在这里我们控制每轮迭代的batch一样,都是1024,则每台机子的训练batch就是256,其他参数保持一致
分布式模式下数据只需要存储在一台机器上面,其他机器的配置参数保持一致即可。
这里选择存储的机器是tensor01.

训练过程如下

tensor101 开了3个端口的机器执行情况如下
在这里插入图片描述
tensor102 机器执行情况如下
在这里插入图片描述

训练结果

tensorflow深度学习两种学习模式MirroredStrateg,MultiWorkerMirroredStrategy进行对比-- 实际案例《针对玩家一段时间表现识别是否为脚本玩家》_第2张图片
在训练次数较少的情况下,总体上的训练结果没有单机模式好。但是在训练轮次比较多的时候这两者之间并没有多大差别(测试过迭代轮次50轮结果并没有多大差别
从迭代速率上来看,分布式模式下的训练速度每次迭代要80s,总体需要414s,比单机模式下的快100s,但是并没有想象中的快多少,这是什么原因呢?

原因如下
从训练过程中服务器的cpu使用效率上可以看出来,在单机模式下,cpu的使用效率达到近800%。但是在分布式模式下也就300%左右,这是因为在分布式模式下,每台机器需要处理的数据量都分配好了的,在4台机器情况下,每次迭代每台机器需要处理256个样本,而每次需要汇总各个机器的迭代计算的loss来进行参数调整,所以迭代效率取决于最慢的那台机器。这也是本人为什么要在tensor101上开3个端口的原因。

总结

分布式模式下确实比单机模式要快,但是快多少取决于你的集群里面机器的配置,若机器配置基本一致的话,分布式比单机要快很多。但是如果机器配置不一样,训练的速率就取决于最慢的那台机器。

你可能感兴趣的:(tensorflow分布式计算,脚本玩家识别)