TensorFlow2.0入门到进阶系列——7_tensorflow分布式

1、理论部分

1.1、GPU设置

  • 默认使用全部GPU并且内存全部占满,这样很浪费资源
  • 如何不浪费内存和计算资源
    • 内存自增长
    • 虚拟设备机制
  • 多GPU使用
    • 虚拟GPU & 实际GPU
    • 手工设置 & 分布式机制

1.1.1、API列表

  • tf.debugging.set_log_device_placement(打印一些信息,某个变量分配在哪个设备上)
  • tf.config.expermental.set_visible_devices(设置本进程的可见设备)
  • tf.config.experimental.list_logical_devices(获取所有的逻辑设备,eg:物理设备比作磁盘,逻辑设备就是磁盘分区)
  • tf.config.experimental.list_physcial_devices(获取物理设备的列表,有多少个GPU就获取到多少个GPU)
  • tf.config.experimental.set_memory_growth(内存自增,程序对GPU内存的占用,用多少占多少,而不是全占满)
  • tf.config.experimental.VirtualDeviceConfiguration(建立逻辑分区)
  • tf.config.set_soft_device_placement(自动把某个计算分配到某个设备上)

1.2、分布式策略

为什么需要分布式:

  • 数据量太大
  • 模型太复杂
    tensorflow都支持哪些分布式策略:
  • MirroredStrategy
  • CentralStorageStrategy
  • MultiworkerMirroredStrtegy
  • TPUStrategy
  • ParameterServerStrategy

1.2.1、MirroredStrategy镜像策略

在这里插入图片描述

1.2.2、CentralStorageStrategy

在这里插入图片描述

1.2.3、MultiworkerMirroredStrtegy

在这里插入图片描述

1.2.4、TPUStrategy

在这里插入图片描述

1.2.5、ParameterServerStrategy

在这里插入图片描述
伪代码讲解:
在这里插入图片描述
分布式类型:
在这里插入图片描述
在这里插入图片描述
同步异步优缺点:
同步:
在这里插入图片描述
异步:
在这里插入图片描述
在这里插入图片描述

2、实战部分

2.1、GPU设置实战

2.1.1、GPU使用实战

查看有多少个GPU,命令:nvidia-smi
在这里插入图片描述
在这里插入图片描述
设置GPU内存增长
tf_gpu_1

import matplotlib as mpl
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
import sklearn
import pandas as pd
import os
import sys
import time
import tensorflow as tf

from tensorflow import keras

print(tf.__version__)
print(sys.version_info)
for module in mpl, np, pd, sklearn, tf, keras:
    print(module.__name__, module.__version__)

tf.debugging.set_log_device_placement(True)  #打印出模型的各个变量分布在哪个GPU上,
gpus = tf.config.experimental.list_physical_devices('GPU')
#必须要在GPU启动的时候被设置否则会报错
for gpu in gpus:
    tf.config.experimental.set_memory_growth(gpu, True)   #设置GPU自增长
print(len(gpus))
logical_gpus = tf.config.experimental.list_logical_devices('GPU')
print(len(logical_gpus))

fashion_mnist = keras.datasets.fashion_mnist
(x_train_all, y_train_all), (x_test, y_test) = fashion_mnist.load_data()
x_valid, x_train = x_train_all[:5000], x_train_all[5000:]
y_valid, y_train = y_train_all[:5000], y_train_all[5000:]

print(x_valid.shape, y_valid.shape)
print(x_train.shape, y_train.shape)
print(x_test.shape, y_test.shape)
from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
x_train_scaled = scaler.fit_transform(
    x_train.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28, 1)
x_valid_scaled = scaler.transform(
    x_valid.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28, 1)
x_test_scaled = scaler.transform(
    x_test.astype(np.float32).reshape(-1, 1)).reshape(-1, 28, 28, 1)

生成dataset;

def make_dataset(images, labels, epochs, batch_size, shuffle=True):
    dataset = tf.data.Dataset.from_tensor_slices((images, labels))
    if shuffle:
        dataset = dataset.shuffle(10000)
    dataset = dataset.repeat(epochs).batch(batch_size).prefetch(50)
    return dataset

batch_size = 128
epochs = 100
#生成训练集的dataset
train_dataset = make_dataset(x_train_scaled, y_train, epochs, batch_size)

默认使用第一个GPU
在这里插入图片描述

model = keras.models.Sequential()
model.add(keras.layers.Conv2D(filters=32, kernel_size=3,
                              padding='same',
                              activation='relu',
                              input_shape=(28, 28, 1)))
model.add(keras.layers.Conv2D(filters=32, kernel_size=3,
                              padding='same',
                              activation='relu'))
model.add(keras.layers.MaxPool2D(pool_size=2))
model.add(keras.layers.Conv2D(filters=64, kernel_size=3,
                              padding='same',
                              activation='relu'))
model.add(keras.layers.Conv2D(filters=64, kernel_size=3,
                              padding='same',
                              activation='relu'))
model.add(keras.layers.MaxPool2D(pool_size=2))
model.add(keras.layers.Conv2D(filters=128, kernel_size=3,
                              padding='same',
                              activation='relu'))
model.add(keras.layers.Conv2D(filters=128, kernel_size=3,
                              padding='same',
                              activation='relu'))
model.add(keras.layers.MaxPool2D(pool_size=2))
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(128, activation='relu'))
model.add(keras.layers.Dense(10, activation="softmax"))

model.compile(loss="sparse_categorical_crossentropy",
              optimizer = "sgd",
              metrics = ["accuracy"])

在这里插入图片描述

model.summary()

在这里插入图片描述

history = model.fit(train_dataset,
                    steps_per_epoch = x_train_scaled.shape[0] // batch_size,
                    epochs=10)

在这里插入图片描述
查看GPU占用情况:
在这里插入图片描述
使用命令实时监控 nvidia-smi 的结果:watch -n 0.1 -x nvidia-smi
(-n是时间间隔,刷新时间0.1s,-x表示要监控哪条命令)
在这里插入图片描述
其他GPU的使用(默认只使用第一个GPU)
tf_gpu_2-visible_gpu
方法:只让一个指定的GPU可见,设置其他GPU不可见

import matplotlib 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值