机器学习实战-基于scikit-learn、keras和tensorflow笔记 - 19

第十九章:大规模训练和部署tensorflow模型

为TensorFlow模型提供服务

当然可以用Flask搭建服务,但是使用TensorFlow Serving会更加方便

  1. 导出SavedModel(目录中含有版本号0001、0002,包含有一个或多个元图,元图中有tag标记比如train、serve、gpu,其中serve标记的元图中包含初始化函数和默认服务函数)
  2. 运行docker容器:tensorflow/serving
  3. REST api或者gRPC(一个例子是浮点数在http中使用json传输会占用很多的bit,而gRPC只会占用32bit)访问serving服务,获取预测结果
  4. 平稳过渡:可以训练多个版本的模型,命名为0002、0003,然后放到指定的模型目录中,就可以自动调用最新的模型,甚至可以在需要的时候Rollback(只需要删除0002、0003即可)
  5. 类似于Web服务,TensorFlow Serving部署在多台服务器,甚至可以使用Kubernetes进行负载均衡等

另外就是GCP(Google Cloud Platform)可以创建预测服务,具体见文档

模型部署到嵌入式设备或移动端

TFLite也使用SavedModel,但是进行了模型压缩(FlatBuffers格式,可以使用Netron图形化工具查看一下原模型和压缩后的模型区别)。

另外使用半精度浮点数或者整数量化(浮点数映射到整数,先找到最大绝对值,然后进行量化)可以减小模型尺寸,但这种方法只是减少了模型的存储和传输成本,运行时仍然需要转换回浮点数(可以通过缓存避免始终重新计算);一个例外是可以使用量化激活技术,完全使用整数进行计算。

量化会降低精度,但用quantization-aware training可以减少量化噪声,使权重对量化更有鲁棒性。

GPU加速

GCP GPU VM和Colaboratory使Google提供的两种在线GPU获取的方法,其中Colab有30min browser active,12h max的时间限制,且最多有5个notebook同时运行

管理GPU内存

通过for gpu in tf.config.experimental.list_physical_devices('GPU'):对每一个GPU进行配置

  1. CUDA_VISIBLE_DEVICE和CUDA_DEVICE_ORDER(GPU的命名顺序,为了可复现性)可以配置进程的GPU可见性,比如每个进程只能利用两个GPU
  2. tf.config.experimental.set_virtual_device_configuration可以配置每个进程在每个GPU上可见的GPU内存,当然也可以用tf.config.experimenal.set_memory_growth来动态获取显存(默认是在第一次运行计算时获取所有显存)

指定设备

默认情况下,tf.Variable(42)没有GPU内核,会被放置在cpu,而tf.Variable(42.0)则会放置在gpu,可以使用with tf.device('/cpu:0')来指定

跨设备并行

计算图 -> 入度为0 -> 进入cpu队列(inter-op和intra-op,其中intra-op是可并行的inter-op的进一步分解)或者gpu队列(cuda或者cuDNN)进行计算 -> 依赖节点的入度-1

当然可以并行训练多个模型,然后用集成学习合并,但如果并行训练一个怎么办?

  1. 模型并行

    Dense网络层与层之间连接太多,跨设备通信太多(无论是水平划分还是垂直划分到多个GPU上)不合适;卷积神经网络层与层之间只有部分连接,比较合适,RNN的话也相对合适,同层之间也有数据传输,可以在同一个GPU上执行

  2. 数据并行

    • 镜像策略
      完全镜像所有模型参数,需要平均(协同操作)层进行所有模型的参数更新(同步(可能导致带宽饱和)或者异步更新(可能引入陈旧梯度,可以通过预热阶段、降低lr避免))
    • 集中参数
      有一个参数服务器(只是在GPU外部,不一定是一台真正的分布式服务器),无论是同步还是异步都很容易导致带宽饱和(可以通过添加更多的参数服务器改善),尤其是大型密集模型,相对来说稀疏模型和小模型问题不大
  3. TensorFlow的实现

    tf.distribute.MirroredStrategy:镜像策略
    tf.distribute.CentralStorageStrategy:集中参数
    tf.distribute.experimental.MultiWorkerMirroredStrategy:分布式镜像策略,需要使用TF_CONFIG环境变量指定不同主机的spec(ip、port等)
    tf.distribute.experimental.ParameterServerStrategy:分布式集中参数策略,需要使用TF_CONFIG环境变量指定不同主机的spec(ip、port等)

    其他还有诸如TPUStrategy等策略

Google Cloud AI

也可以利用Google提供的集群进行训练(甚至提供了一个超参数调节功能)

你可能感兴趣的:(机器学习,深度学习)