通过阿里云容器服务深度学习解决方案上手Caffe+多GPU训练

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 阿里云容器服务提供的深度学习解决方案内置了对Tensorflow, Keras, MXnet框架的环境,并支持基于它们的深度学习模型开发、模型训练和模型预测。同时,对于模型训练和预测,用户还可以通过指定自定义容器镜像的方式,使用其他深度学习框架。

深度学习作为近几年推动人工智能在机器视觉、语音、自然语言处理等领域取得显著进展的主要方法,已经发展成一门相对成熟的学科。同时,随着越来越多科技企业和科研机构的投入,深度学习的基础支撑技术和工程系统也越来越完善,并且呈现百花齐放的局面。以深度学习计算框架为例, Google的Tensorflow拥有最为庞大的粉丝群,Keras在产业界和学界的接受度都有大幅提升,而Caffe在图像类的模型训练上依然是很多算法工程师的最爱。同时,还有大量其他开源框架,比如MXNet, Torch, PyTorch, CNTK, deeplearning4j等也都保持快速演进,并且在不同体系结构和计算环境下也都有相应的框架项目。

目前,阿里云容器服务提供的深度学习解决方案内置了对Tensorflow, Keras, MXnet框架的环境,并支持基于它们的深度学习模型开发、模型训练和模型预测。同时,对于模型训练和预测,用户还可以通过指定自定义容器镜像的方式,使用其他深度学习框架。

本文将描述如何通过自定义镜像的方式,实现使用Caffe框架在GPU设备上进行多卡模型训练。

使用阿里云容器服务的深度学习解决方案,主要的工作包括:

1.     准备计算资源集群

a)       购买ECS计算资源,可以包括CPU和GPU;

b)      创建容器集群管理上述ECS节点;

2.     准备数据存储,用于保存和共享训练数据集、训练日志和结果模型

a)       创建阿里云共享存储服务实例。目前可以支持阿里云OSS和NAS存储服务;

b)      为上述数据存储创建数据卷,用于将共享存储实例挂载入容器内部。方便训练、预测代码从本地目录读写训练数据等;

3.     在阿里云容器服务控制台的解决方案页面填写参数,配置、启动模型训练任务

 

以下将就这几项工作,详细介绍。

1.     创建容器服务集群

通过阿里云容器服务控制台 https://cs.console.aliyun.com (首次使用需要免费开通服务),创建容器集群,详见文档

https://help.aliyun.com/document_detail/52677.html?spm=5176.doc53547.6.900.VyPXtY

注:

1. 容器集群所管理的ECS节点资源,可以提前购买好,然后添加到容器集群内。也可以在创建容器集群的时候自动购买。但目前自动购买仅支持包年包月的ECS实例,在加入容器集群后可以再修改为按量付费的类型。

2. 不同ECS服务区域,提供的GPU实例类型可能不同。需要在提前确认。

 

可以在容器服务控制台查看容器集群的详情,如这里创建的华东2可用区B的容器集群“swarmcluster”

c4339212129c06849b61253d650abc8c67d1bb35

 

2.     创建共享数据存储

容器服务可以通过数据卷挂载的方式支持阿里云OSS对象存储和NAS文件存储。首先,需要创建存储服务实例。

注1: 请在与上述ECS节点的相同阿里云服务区域,创建OSS或NAS存储实例。否则,运行在ECS上的容器将无法访问它们。

OSS对象存储实例创建方法,详见

https://help.aliyun.com/document_detail/31896.html?spm=5176.doc31842.2.5.ug192v

我们在华东2区创建OSS bucket“deeplearning-test”,可以查看其内、外网的访问地址


d0ae155fc1964e35ea8462e1f557a9ff14a64269

NAS文件存储实例创建需要两步,详见

      1. 创建文件系统

https://help.aliyun.com/document_detail/27526.html?spm=5176.doc27527.6.551.t4fGpd

2. 添加挂载点

https://help.aliyun.com/document_detail/60431.html?spm=5176.doc27526.6.552.mTQl8H

 

3.     创建数据卷

创建好数据存储实例后,需要在容器集群中创建对应的数据卷。比如,使用OSS作为训练数据和日志存储,可以创建OSS数据卷,步骤详见

https://help.aliyun.com/document_detail/52681.html?spm=5176.doc52677.6.902.DMpKvy

      

       这里我们创建OSS数据卷“ossdata”,用于连接上述创建的OSS bucket “deep learning-test”。


      97138b63158c264eb60c73b9b40c5ab4a92511f2

创建NAS数据卷的过程与OSS基本类似。

 

4.     启动训练任务

至此,准备工作就绪。可以在容器服务深度学习解决方案中创建模型训练任务,使用CPU/GPU开始训练caffe模型。(可以参考支持 Tensorflow的文档,熟悉如何创建一个内置框架支持的模型训练任务。https://help.aliyun.com/document_detail/52691.html?spm=5176.doc52681.6.909.e9Ka98

 

目前,解决方案还未内置对Caffe框架的支持。可以通过指定自定义镜像的方式,使用用户自己的Caffe框架来训练模型。过程如下,

a)       构建和推送自定义的容器镜像

用户在开通容器服务的同时,也会开通容器镜像仓库服务。可以使用镜像仓库服务,在与集群相同的阿里云区域创建公开的,或者私有的容器镜像仓库。并把希望使用的Caffe框架制作成docker镜像,推送到镜像仓库中。以后在该集群部署的训练任务就可以使用这个Caffe镜像了。

容器镜像仓库构建的文档可以参考

https://help.aliyun.com/document_detail/60997.html?spm=5176.doc60765.6.547.eGFyUs

https://help.aliyun.com/document_detail/44535.html?spm=5176.doc25985.6.676.HGxEOq

在本示例里,我们可以在华东2区创建镜像仓库

registry.cn-shanghai.aliyuncs.com/dl-frameworks/acs-caffe,

使用dockerfile和docker build命令在本地构建好acs-caffe的gpu版镜像,并推送到上述镜像仓库中。

具体地,可以在集群中的一个ECS节点上创建custom_train_caffe.dockerfile文件,示例内容如下:


FROM bvlc/caffe:gpu

RUN  apt-get update && apt-get install -y git vim

RUN  mkdir /starter

COPY ./custom_train_helper.sh /starter

WORKDIR /starter

RUN  chmod +x custom_train_helper.sh

ENTRYPOINT ["./custom_train_helper.sh"]


该镜像基于caffe官方基础镜像bvlc/caffe:gpu,并使用一个自定义的脚本custom_train_helper.sh作为用镜像启动容器时的入口进程。在相同目录下创建custom_train_helper.sh文件供dockerfile文件里构建镜像时使用,内容如下:


#!/bin/bash

default_output_path='/output'

default_remote_volume_path=$DEFAULT_REMOTE_VOLUME_PATH

default_input_path='/input'

# default input dir

if [ -d "$default_remote_volume_path" ] && [ ! -z $default_remote_volume_path ]; then

  ln -s $default_remote_volume_path $default_input_path

fi

# default output dir

if [ ! -d "$default_output_path" ]; then

  mkdir -p $default_output_path

fi

# exec user's command

eval "$@"

echo "Done training."

# auto persist outputs to user's remote volume

if [ -d $default_remote_volume_path ] && [ ! -z $default_remote_volume_path ]; then

  cp -r $default_output_path/ $default_remote_volume_path

else

  echo "Cannot find remote data volume $default_remote_volume_path, checkpoints are not persisted remotely."

fi

脚本逻辑很简单,主要是在执行具体训练命令的前后期,设置工作目录,和训练日志、结果的备份工作。

接下来,在同级目录下构建自定义镜像。

[root@iZuf654hll72glu42o5qp2Z custom-train]# ls -l

-rw-r--r-- 1 root root 396 1月  15 11:22 custom_train_caffe.dockerfile

-rw-r--r-- 1 root root 952 1月  15 11:16 custom_train_helper.sh

[root@iZuf654hll72glu42o5qp2Z custom-train]# docker build -t registry-vpc.cn-shanghai.aliyuncs.com/dl-frameworks/acs-caffe:gpu -f custom-train_caffe.dockerfile .

[root@iZuf654hll72glu42o5qp2Z ~]# docker images

REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE

registry-vpc.cn-shanghai.aliyuncs.com/dl-frameworks/acs-caffe  gpu      a654defdd52a        24 hours ago        3.48GB

bvlc/caffe                                                     gpu      e9d3774d2526        12 days ago         3.39GB

然后可以将构建好的镜像registry.cn-shanghai.aliyuncs.com/dl-frameworks/acs-caffe:gpu推送到之前在华东2区创建的镜像仓库中去。可以参考

https://help.aliyun.com/document_detail/60743.html?spm=5176.doc60765.6.543.JJch13

示例如下:


[root@iZuf654hll72glu42o5qp2Z custom-train]# docker login --username=user@aliyun.com registry-vpc.cn-shanghai.aliyuncs.com

Password:

Login Succeeded

[root@iZuf654hll72glu42o5qp2Z custom-train]# docker push registry-vpc.cn-shanghai.aliyuncs.com/dl-frameworks/acs-caffe:gpu
 

75058b38c4963b6f60ed4af42560fecc9767a319


可以在容器镜像服务的控制台https://cr.console.aliyun.com,“管理”这个镜像仓库。可以查看到刚刚推送的caffe镜像的公网、内网地址。

b05ebae25015b3ef4054c86fe9fea8ca7e3e94b6


b)       在容器服务控制台(https://cs.console.aliyun.com)进入 “解决方案” - “模型训练” 页面,选择“创建”任务

      fc1a5abb68e661c35ac6445afbc1440d7c7b0599


在配置训练任务的页面表单里填入必要的参数:

9479ea59ee8e12529a1608fc71e398275d2af858

具体的参数意义和值如下:

集群:swarmcluster,指定训练任务运行的集群

应用名:test-caffe,训练任务将作为一个容器应用被部署在容器集群中运行;

训练框架:选择自定义镜像

镜像地址:填入上述推送的caffe镜像地址,如

registry.cn-shanghai.aliyuncs.com/dl-frameworks/acs-caffe:gpu 。

分布式训练:勾选后可指定Parameter Server架构的分布式训练任务配置

worker使用GPU数量:单机训练时,任务所使用的GPU卡数量

数据来源:存储训练数据集的数据卷,可支持OSS、NAS和本地数据卷

执行命令:执行模型训练任务的命令。

这里填写的命令,和通常启动训练时执行的命令是一样的。可以执行python程序,如


python /input/tensorflow/mnist_dist_train.py --data_dir=/input/mnist/data/ --train_steps=5000 --log_device_placement=False --log_dir=/output/mnist/log --batch_size=100 --learning_rate=0.01 --sync_replicas=False --num_gpus=2

也可以执行shell脚本,比如 "/input/train-mnist.sh"。只要确保shell文件存在于容器内正确的路径下。在任务容器启动时都会以 “sh –c 命令”的形式自动执行。

本示例中用到的训练命令是执行脚本“train-mnist.sh”。该脚本只要提前存放在OSS存储bucket“deeplearning-test”的根目录下。

在使用上述构建的镜像启动容器时,会通过“ossdata”数据卷自动挂载到容器内的“/input”目录下。这样就可以在容器内像执行本地脚本一样运行“train-mnist.sh”了。

示例脚本内容也很简单,会运行Caffe自带的mnist训练例子。

 

   #!/bin/bash
   set -e

   cd /opt/caffe/
   ./data/mnist/get_mnist.sh
   sh examples/mnist/create_mnist.sh
   sh examples/mnist/train_lenet.sh


其中 create_mnist.sh用于准备mnist训练数据集,代码如下:


#!/usr/bin/env sh
   # This script converts the mnist data into lmdb/leveldb format,
   # depending on the value assigned to $BACKEND.
   set -e

   EXAMPLE=examples/mnist
   DATA=data/mnist
   BUILD=build/examples/mnist
   BACKEND="lmdb"

   echo "Creating ${BACKEND}..."
   rm -rf $EXAMPLE/mnist_train_${BACKEND}
   rm -rf $EXAMPLE/mnist_test_${BACKEND}
   $BUILD/convert_mnist_data.bin $DATA/train-images-idx3-ubyte \
      $DATA/train-labels-idx1-ubyte $EXAMPLE/mnist_train_${BACKEND} --backend=${BACKEND}
   $BUILD/convert_mnist_data.bin $DATA/t10k-images-idx3-ubyte \
     $DATA/t10k-labels-idx1-ubyte $EXAMPLE/mnist_test_${BACKEND} --backend=${BACKEND}
   echo "Done."

train_lenet.sh脚本用于真正执行Caffe训练任务,其中指定了模型定义为lenet_solver。代码如下:


#!/usr/bin/env sh

   set -e
   ./build/tools/caffe train --solver=examples/mnist/lenet_solver.prototxt $@
 

训练监控:目前只支持基于Tensorboard的训练监控可视化服务,本例中先不使用。如果勾选,会自动部署Tensorboard服务,并与下面指定的日志存储路径自动关联。这样,训练代码中输出的日志可以被Tensorboard读取。

训练日志路径:用于存储训练过程中输出的日志和结果。请在训练代码中使用同样的路径。

确定”后,训练任务将被作为容器应用创建,自动调度到合适的GPU节点,并开始执行训练命令


c)     查看训练容器运行详情

训练任务创建后,会以应用容器的方式运行。在容器服务控制台,进入“应用”页面,可以找到前面创建的任务“test-caffe”。


cf9c5178d080741bc134c858e5478ffec4fb7490

可以点击应用名,查看更多任务执行的状况。

可以看到上述任务有一个容器“test-caffe_worker1”在运行,查看该容器的运行的节点位置,以及查看资源监控和日志信息。也可以通过简单的web远程终端,直接进入该容器内部。效果和通过SSH进入容器一样。  

fe7f332b44891792e44269bedb289daf9b64751d  

训练过程输出的日志会实时地显示在对应的容器名下。

f6cb122f259fb2c946afd171956661321b2441f8

通过简单的web远程终端进入容器内部操作。

a310c719208a70bb7c545a527cfbc58d4e1dfcbb

根据训练任务的复杂程度,在等待一段时间后,训练结束。任务容器会自动退出,释放所占用的GPU等资源。

5142b50431137c4bb95b8ca389d14d7cbc25fd1c

0ae6fda8742b2b40d68a78d98c1f1f975a05064d

 

至此,通过自定义镜像的方式,用户可以使用容器服务简单、快速地运行基于Caffe等任何深度学习框架的模型训练。训练任务调度、计算资源分配、GPU使用率优化、数据存储的集成、集群管理,监控等工作都不需要额外的投入。


相关实践学习
通过workbench远程登录ECS,快速搭建Docker环境
本教程指导用户体验通过workbench远程登录ECS,完成搭建Docker环境的快速搭建,并使用Docker部署一个Nginx服务。
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
2月前
|
机器学习/深度学习 存储 PyTorch
【AMP实操】解放你的GPU运行内存!在pytorch中使用自动混合精度训练
【AMP实操】解放你的GPU运行内存!在pytorch中使用自动混合精度训练
68 0
|
2月前
|
人工智能 运维 Kubernetes
阿里云容器服务ACK AI助手正式上线带来的便利性
作为开发者想必大家都知道,云原生容器技术的优势,尤其是近两年的随着容器技术的迅猛发展,Kubernetes(K8s)已成为广泛应用于容器编排和管理的领先解决方案,但是K8s的运维复杂度一直是挑战之一。为了应对这一问题,就在最近,阿里云容器服务团队正式发布了ACK AI助手,这是一款旨在通过大模型增强智能诊断的产品,旨在帮助企业和开发者降低Kubernetes(K8s)的运维复杂度。那么本文就来详细讲讲关于这款产品,让我们结合实际案例分享一下K8s的运维经验,探讨ACK AI助手能否有效降低K8s的运维复杂度,并展望ACK AI助手正式版上线后的新功能。
268 2
阿里云容器服务ACK AI助手正式上线带来的便利性
|
1月前
|
机器学习/深度学习 数据采集 PyTorch
使用PyTorch解决多分类问题:构建、训练和评估深度学习模型
使用PyTorch解决多分类问题:构建、训练和评估深度学习模型
使用PyTorch解决多分类问题:构建、训练和评估深度学习模型
|
3月前
|
Kubernetes 监控 调度
阿里云容器服务ACK
阿里云容器服务ACK(Alibaba Cloud Container Service for Kubernetes)提供高性能、可伸缩的容器应用管理服务,支持企业级Kubernetes容器化应用的生命周期管理。在ACK中,利用cGPU(Containerized GPU)技术可以实现GPU资源的共享,提高GPU利用率,降低整体成本。
68 6
|
6天前
|
机器学习/深度学习 运维 监控
TensorFlow分布式训练:加速深度学习模型训练
【4月更文挑战第17天】TensorFlow分布式训练加速深度学习模型训练,通过数据并行和模型并行利用多机器资源,减少训练时间。优化策略包括配置计算资源、优化数据划分和减少通信开销。实际应用需关注调试监控、系统稳定性和容错性,以应对分布式训练挑战。
|
8天前
|
机器学习/深度学习 并行计算 算法框架/工具
Anaconda+Cuda+Cudnn+Pytorch(GPU版)+Pycharm+Win11深度学习环境配置
Anaconda+Cuda+Cudnn+Pytorch(GPU版)+Pycharm+Win11深度学习环境配置
|
2月前
|
机器学习/深度学习
转弯半径-深度学习训练
转弯半径(RADIUS OF TURNING CIRCLE),是指汽车行驶过程中,由转向中心到前外转向轮与地面接触点的距离。当方向盘转到极限位置时,由转向中心到前外转向轮接地中心的距离称为最小转弯半径,它反映了汽车通过最小曲率半径弯曲道路的能力和在狭窄路面上调头行驶的能力。
20 1
|
3月前
|
存储 机器学习/深度学习 人工智能
基于Megatron-Core的稀疏大模型训练工具:阿里云MoE大模型最佳实践
随着大模型技术的不断发展,模型结构和参数量级快速演化。大模型技术的应用层出不穷。大模型展现惊人效果,但训练和推理成本高,一直是巨大挑战。模型稀疏化能降低计算和存储消耗。近期以Mixtral为代表的MoE(多专家混合)大模型证明了稀疏MoE技术能大幅降低计算量、提升推理速度,模型效果甚至超过同规模稠密模型。阿里云PAI和NVIDIA团队深入合作,基于Megatron-Core MoE框架,解决了MoE大模型训练落地时会遇到的可拓展性、易用性、功能性以及收敛精度等核心问题,在下游任务上取得了很好的模型效果。
|
3月前
|
机器学习/深度学习 人工智能 分布式计算
阿里云PAI:一站式AI研发平台,引领深度学习潮流
阿里云PAI:一站式AI研发平台,引领深度学习潮流 随着人工智能的飞速发展,深度学习框架已经成为AI研发的核心工具。然而,选择合适的深度学习框架并不容易,需要考虑的因素包括计算性能、易用性、支持的算法组件等多种因素。今天,我们就来介绍一款一站式AI研发平台——阿里云PAI,看看它如何解决这些痛点。
116 1
|
3月前
|
机器学习/深度学习 自然语言处理 数据格式
训练你自己的自然语言处理深度学习模型,Bert预训练模型下游任务训练:情感二分类
训练你自己的自然语言处理深度学习模型,Bert预训练模型下游任务训练:情感二分类
55 0

相关产品

  • 容器计算服务