2018-11-27 10:02:49.878414:i tensorflow/core/common-runtime/gpu/gpu-device.cc:1511]添加可见gpu设备:0,1,2,3
2018-11-27 10:02:49.878462:i TensorFlow/core/common-runtime/gpu/gpu-device.cc:982]设备互连流执行器,带强度1边缘矩阵:
2018-11-27 10:02:49.878471:i TensorFlow/core/common-runtime/gpu/gpu-device.cc:988]0 1 2 3
2018-11-27 10:02:49.878477:i TensorFlow/core/common-runtime/gpu/gpu-device.cc:1001]0:n y y y
2018-11-27 10:02:49.878481:i TensorFlow/core/common-runtime/gpu/gpu-device.cc:1001]1:y n y
2018-11-27 10:02:49.878486:i TensorFlow/core/common-runtime/gpu/gpu-device.cc:1001]2:y y y n y
2018-11-27 10:02:49.878492:i TensorFlow/core/common-runtime/gpu/gpu-device.cc:1001]3:y y y y n
2018-11-27 10:02:49.879340:i TensorFlow/core/common-runtime/gpu/gpu-device.cc:1115]创建了TensorFlow设备(/device:gpu:0,内存14874 MB)->物理gpu(设备:0,名称:Tesla v100-sxm2-16GB,PCI总线ID:0000:00:1b.0,计算能力:7.0)
2018-11-27 10:02:49.879486:i TensorFlow/core/common-runtime/gpu/gpu-device.cc:1115]创建了TensorFlow设备(/device:gpu:1,内存14874 MB)->物理gpu(设备:1,名称:Tesla v100-sxm2-16GB,PCI总线ID:0000:00:1C.0,计算能力:7.0)
2018-11-27 10:02:49.879694:i TensorFlow/core/common-runtime/gpu/gpu-device.cc:1115]创建了TensorFlow设备(/device:gpu:2,内存14874 MB)->物理gpu(设备:2,名称:Tesla v100-sxm2-16GB,PCI总线ID:0000:00:1d.0,计算能力:7.0)
2018-11-27 10:02:49.879872:i tensorflow/core/common-runtime/gpu/gpu-device.cc:1115]创建tensorflow设备(/device:gpu:3,内存14874 MB)->物理gpu(设备:3,名称:特斯拉v100-sxm2-16GB,PCI总线ID:0000:00:1e.0,计算能力:7.0)
< /代码>
在有关于每个GPU的日志信息之前,重复4次
2018-11-27 10:02:46.447639:i tensorflow/core/common-runtime/gpu/gpu-device.cc:1432]found device 3 with properties:
名称:Tesla V100-SXM2-16GB主要:7次要:0内存锁存率(GHz):1.53
PCIBusID:0000:00:1e.0
总内存:15.78Gib可用内存:15.37Gib
< /代码>
根据日志记录,所有4个GPU都可见并加载在TensorFlow Keras后端中。此后,没有应用程序日志记录,培训作业状态为“正在进行中”,过一段时间后,它变为“失败”,具有相同的“算法错误”。
查看CloudWatch日志记录,我可以看到一些工作中的指标。具体来说,gpu memory utilization,cpu utilizationare ok,whilegpu utilizationis 0%.

[update]。
由于aknownkeras上关于保存多gpu模型的bug,我正在使用multi-gpu-model的此覆盖
从keras.layers导入lambda,连接
从Keras导入模型
将TensorFlow导入为tf
def multi_gpu_型号(型号,gpu):
#来源:https://github.com/keras team/keras/issues/8123 issuecomment-354857044
如果isInstance(gpus,(list,tuple)):
num_gpus=长度(gpus)
target_gpu_ids=gpu
其他:
NUMPGGPUP= GPU
target_gpu_ids=范围(num_gpu)
def get_slice(数据,i,部件):
形状=tf.形状(数据)
批次尺寸=形状[:1]
输入形状=形状[1:]
步骤=批次尺寸//零件
如果i==num_gpus-1:
尺寸=批次尺寸-步骤*i
其他:
大小=步骤
大小=tf.concat([大小,输入_形状],轴=0)
步幅=tf.concat([步幅,输入_-shape*0],轴=0)
开始=跨步*i
返回tf.slice(数据、开始、大小)
所有输出=[]
对于范围内的i(len(model.outputs)):
所有输出。附加([])
#在每个GPU上放置一个模型副本,
#每个人都得到一部分输入。
对于i,枚举中的gpu-id(目标gpu-id):
使用tf.device('/gpu:%d'%gpu\u id):
使用tf.name_scope(“副本”%d“%gpu id”):
输入= []
#检索输入的切片。
对于x in model.inputs:
输入_shape=tuple(x.get_shape().as_list())[1:]
slice_i=lambda(获取_slice,
输出形状=输入形状,
arguments='i':我,
“零件”:num_gpus)(x)
inputs.append(切片i)
#在切片上应用模型
#(在目标设备上创建模型副本)。
输出=模型(输入)
如果不是IsInstance(输出,列表):
输出=[输出]
#保存输出以便稍后重新合并。
对于范围内的O(长度(输出)):
所有输出[O].附加(输出[O])
#合并CPU上的输出。
使用tf.device(“/cpu:0”):
合并=
对于名称,以zip格式输出(model.output_name,all_outputs):
合并.append(concatenate(outputs,
轴=0,名称=名称)
返回模型(model.inputs,合并)
< /代码>
这在本地2X Nvidia GTX 1080/Intel Xeon/Ubuntu 16.04上工作正常。它将在Sagemaker培训工作中失败。
我已经在美国焊接学会Sagemaker论坛上发表了这个问题。