- Kubernetes >= 1.8
- kubectl
- Helm >= 3.0
请参考安装文档 中一键安装所有依赖组件部分,安装时需要指定参数 --tags.all-dep=true
。
安装好云上飞桨产品后,您可以通过以下命令来获取安装在集群中的 JupyterHub 服务的 IP 地址。
$ kubectl get service -n kubeflow | grep jupyterhub
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
pdc-jupyterhub-hub ClusterIP 10.152.183.100 <none> 8081/TCP 1d
pdc-jupyterhub-proxy-api ClusterIP 10.152.183.179 <none> 8001/TCP 1d
pdc-jupyterhub-proxy-public LoadBalancer 10.152.183.92 <pending> 80:30553/TCP 1d
从上述命令的输出中找到 proxy-public 对应的 EXTERNAL-IP 地址,然后访问 http://<EXTERNAL-IP>:80
链接,打开 JupyterHub UI 界面,然后创建用户名和密码即可使用。
如果 proxy-public 对应的 EXTERNAL-IP 地址是 (如本示例),则意味着您所使用的 Kubernetes 集群的局域网80端口并没有开放,您可以使用下面的命令来启动个临时代理服务。
kubectl port-forward --address 0.0.0.0 svc/pdc-jupyterhub-proxy-public -n paddlecloud 8080:80
然后访问 http://localhost:8080
链接,打开 JupyterHub UI 界面。初试用户名是 admin
,密码是 paddlepaddle
。
进入 notebook 页面后,在 work 目录下创建 yaml 文件夹,并将 Components YAML 等文件上传到该目录中,如下图:
然后,在work目录下创建新的 Notebook 用于编写工作流代码。构建工作流需要使用 Python SDK,所以需要安装相关依赖包:
In[1] !pip install kfp -i https://mirror.baidu.com/pypi/simple
以下通过 OCR 领域的文本检测场景为例,展示了 PP-OCR 模型云上训练到服务部署工作流的落地实践,完整代码请查看pipeline-demo
由于从模型训练到模型服务部署各阶段间,会产出临时文件,比如模型训练日志、模型快照、不同格式的模型文件等,所以需要创建一个共享盘,这样工作流中各阶段任务就能够共享这些临时文件,完成整个流程。以下为创建 Pipeline 共享盘的示例代码:
import kfp
import kfp.dsl as dsl
from kfp import components
def create_volume_op():
"""
创建 PaddleOCR Pipeline 所需的共享存储盘
:return: VolumeOp
"""
return dsl.VolumeOp(
name="PPOCR Detection PVC",
resource_name="ppocr-detection-pvc",
storage_class="task-center",
size="10Gi",
modes=dsl.VOLUME_MODE_RWM
).set_display_name("create volume for pipeline")
在进行模型训练任务之前,需要将样本数据从远程的存储服务中拉取到本地,并以分布式的形式缓存到训练集群的节点上,这样能够大幅加上模型训练作业的效率。这里用到的样本数据集是 icdar2015。
def create_dataset_op():
"""
将样本数据集拉取到训练集群本地并缓存
:return: DatasetOp
"""
dataset_op = components.load_component_from_file("./yaml/dataset.yaml")
return dataset_op(
name="icdar2015",
partitions=1, # 缓存分区数
source_secret="data-source", # 数据源的秘钥
source_uri="bos://paddleflow-public.hkg.bcebos.com/icdar2015/" # 样本数据URI
).set_display_name("prepare sample data")
Training API 中提供开启 VisualDL 模型训练日志可视化的接口,同时还提供了模型转化和预训练模型接口,您可以通过指定相关参数来进行配置。
def create_training_op(volume_op):
"""
使用飞桨生态套件进行模型训练的组件,支持PS和Collective两种架构模式
:param volume_op: 共享存储盘
:return: TrainingOp
"""
training_op = components.load_component_from_file("./yaml/training.yaml")
return training_op(
name="ppocr-det",
dataset="icdar2015", # 数据集
project="PaddleOCR", # Paddle生态项目名
worker_replicas=1, # Collective模式Worker并行度
gpu_per_node=1, # 指定每个worker所需的GPU个数
use_visualdl=True, # 是否启动模型训练日志可视化服务
train_label="train_icdar2015_label.txt", # 训练集的label
test_label="test_icdar2015_label.txt", # 测试集的label
config_path="configs/det/det_mv3_db.yml", # 模型训练配置文件
pvc_name=volume_op.volume.persistent_volume_claim.claim_name, # 共享存储盘
# 模型训练镜像
image="registry.baidubce.com/paddleflow-public/paddleocr:2.1.3-gpu-cuda10.2-cudnn7",
# 修改默认模型配置
config_changes="Global.epoch_num=10,Global.log_smooth_window=2,Global.save_epoch_step=5",
# 预训练模型URI
pretrain_model="https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/MobileNetV3_large_x0_5_pretrained.pdparams",
).set_display_name("model training")
云上飞桨产品使用 Minio 组件来提供模型存储服务,您可以通过 ModelHub 相关 API 来进行版本管理。
def create_modelhub_op(volume_op):
"""
模型转换、存储、版本管理组件
:param volume_op:
:return:
"""
modelhub_op = components.load_component_from_file("./yaml/modelhub.yaml")
return modelhub_op(
name="ppocr-det",
model_name="ppocr-det", # 模型名称
model_version="latest", # 模型版本号
pvc_name=volume_op.volume.persistent_volume_claim.claim_name, # 共享存储盘
).set_display_name("upload model file")
Serving 组件支持蓝绿发版、自动扩缩容等功能,您可以通过相关参数进行配置。
def create_serving_op():
"""
部署模型服务
:return: ServingOp
"""
serving_op = components.load_component_from_file("./yaml/serving.yaml")
return serving_op(
name="ppocr-det",
model_name="ppocr-det", # 模型名称
model_version="latest", # 模型版本
port=9292, # Serving使用的端口
# PaddleServing镜像
image="registry.baidubce.com/paddleflow-public/serving:v0.6.2",
).set_display_name("model serving")
通过 Python SDK 构建 PP-OCR 工作流,并将工作流提交到集群上运行。
其中ml_pipeline_ip
需要手动获得。
@dsl.pipeline(
name="ppocr-detection-demo",
description="An example for using ppocr train.",
)
def ppocr_detection_demo():
# 创建 ppocr pipeline 各步骤所需的存储盘
volume_op = create_volume_op()
# 拉取远程数据(BOS/HDFS)到训练集群本地,并缓存
dataset_op = create_dataset_op()
dataset_op.execution_options.caching_strategy.max_cache_staleness = "P0D"
# 采用Collective模型分布式训练ppocr模型,并提供模型训练可视化服务
training_op = create_training_op(volume_op)
training_op.execution_options.caching_strategy.max_cache_staleness = "P0D"
training_op.after(dataset_op)
# 将模型转换为 PaddleServing 可用的模型格式,并上传到模型中心
modelhub_op = create_modelhub_op(volume_op)
modelhub_op.execution_options.caching_strategy.max_cache_staleness = "P0D"
modelhub_op.after(training_op)
# 从模型中心下载模型,并启动 PaddleServing 服务
serving_op = create_serving_op()
serving_op.execution_options.caching_strategy.max_cache_staleness = "P0D"
serving_op.after(modelhub_op)
if __name__ == "__main__":
import kfp.compiler as compiler
ml_pipeline_ip = None
pipeline_file = "ppocr_detection_demo.yaml"
compiler.Compiler().compile(ppocr_detection_demo, pipeline_file)
client = kfp.Client(host="http:{}//:80".format(ml_pipeline_ip))
run = client.create_run_from_pipeline_package(
pipeline_file,
arguments={},
run_name="paddle ocr detection demo",
service_account="pipeline-runner"
)
获得 ml_pipeline_ip
命令行输入 kubectl get service -n kubeflow | grep ml-pipeline
查看kubeflow下的service,得到如下图所示的输出
找到ml-pipeline对应的Cluster-ip,作为ml_pipeline_ip的值
将任务提交后,可以在 Pipeline UI 中查看 PP-OCR 模型工作流的执行情况。
使用 Training Components 创建飞桨模型训练作业时,可以通过 use_visualdl 参数来指定是否开启可视化服务,通过以下命令可以将 VisualDL的 Service 映射到宿主机上,
$ kubectl port-forward svc/ml-pipeline-ui -n kubeflow 8765:80
然后访问 http://localhost:8765 就可以进入 VisualDL 的UI界面了。