Server - 配置 Kubernetes 多任务流程 KubeFlow Pipeline 的开发教程

news2024/11/16 5:29:30

欢迎关注我的CSDN:https://spike.blog.csdn.net/
本文地址:https://spike.blog.csdn.net/article/details/140281680

免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。


KFP

Kubernetes 的 KFP(Kubeflow Pipelines)是一个平台,用于构建和部署可扩展和可移植的机器学习(ML)工作流。允许用户以简单、可复用和可组合的方式定义机器学习任务,并支持各种 ML 框架。KFP 包括一个用于构建 ML 管道的 SDK,以及用于运行这些管道的运行时环境。通过 KFP,用户可以轻松地将机器学习模型从实验转移到生产环境,同时保持模型的可追溯性和版本控制。

KFP 的建议版本 1.8.191.8.22

Name: kfp
Version: 1.8.22
Summary: KubeFlow Pipelines SDK
Home-page: https://github.com/kubeflow/pipelines
Author: The Kubeflow Authors
Author-email: 
License: 
Location: /Users/wang/venv_ml_p3/lib/python3.9/site-packages
Requires: absl-py, click, cloudpickle, Deprecated, docstring-parser, fire, google-api-core, google-api-python-client, google-auth, google-cloud-storage, jsonschema, kfp-pipeline-spec, kfp-server-api, kubernetes, protobuf, pydantic, PyYAML, requests-toolbelt, strip-hints, tabulate, typer, uritemplate, urllib3
Required-by: 


Name: PyYAML
Version: 6.0.1
Summary: YAML parser and emitter for Python
Home-page: https://pyyaml.org/
Author: Kirill Simonov
Author-email: xi@resolvent.net
License: MIT
Location: /Users/wang/venv_ml_p3/lib/python3.9/site-packages
Requires: 
Required-by: kfp, kubernetes

注意:不要安装最新的版本,否则会报错在component_factory.py中,Missing type annotation for argument

在安装 kfp 过程中,如果遇到 AttributeError: cython_sources 问题,即错误:

running egg_info
writing lib3/PyYAML.egg-info/PKG-INFO
writing dependency_links to lib3/PyYAML.egg-info/dependency_links.txt
writing top-level names to lib3/PyYAML.egg-info/top_level.txt
      AttributeError: cython_sources
      [end of output]
# ...  
  note: This error originates from a subprocess, and is likely not a problem with pip.
error: subprocess-exited-with-error

参考: GitHub - AttributeError: cython_sources when installing KFP SDK + running Python components

Seeing this issue on GCP Vertex that uses Kubeflow internally. Forcing pyyaml==5.3.1 with non-working kfp==1.8.21 fixes the issue (following already mentioned comment)

即预先安装 pyyaml==5.3.1,即可:

pip uninstall cython
 
pip install pyyaml==5.3.1
pip install kfp==1.8.19

pip install pyyaml==6.0.1
pip install kfp==1.8.22

构建生成脚本 afm_pipeline.py,包括 2 个Jobs,Job1 在 Job2 之后运行,即:

from string import Template

import kfp
import kfp.dsl as dsl
import yaml

msa_job_yaml = Template("""
apiVersion: batch/v1
kind: Job
metadata:
  name: afm-msa-search # 训练名字
spec:
  completions: 2    # 总pod数量
  parallelism: 2    # 并行运行的pod数量
  backoffLimit: 0   # 重试次数,这里失败后不需要重试
  template:
    metadata:
        annotations:
            sidecar.istio.io/inject: "false"
        labels:
            file-mount: "true"      # 这两个label必须加,kubeflow帮你自动配置一些基本环境
            user-mount: "true"
    spec:
      nodeSelector:
          service: "[your service name]"   # device是gpu类型,比如a10,a100
      tolerations:
        - key: role
          operator:  Equal
          value: [your group name]
          effect: NoSchedule
      containers:
        - name: sp
          image: "af2:v1.04"   # 统一用这个镜像,提供一个基础conda和cuda环境
          imagePullPolicy: Always
          resources:
            limits:
              cpu: "62"
              memory: 124G
            requests:
              cpu: "62"
              memory: 124G
          command: [
            "/bin/sh",
            "-cl",
            "python -u [msa_script]"]     # 执行的命令
          workingDir: "af2/"        # 默认的工作目录,就是你启动脚本的所在目录
          env:                     # 这是把每个pod的名字注入环境变量,以便能够在程序里区分当前是在哪一个pod中
            - name: PODNAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
      restartPolicy: Never
""")

model_job_yaml = Template("""
apiVersion: batch/v1
kind: Job
metadata:
  name: afm-model-infer # 训练名字
spec:
  completions: 2    # 总pod数量
  parallelism: 2    # 并行运行的pod数量
  backoffLimit: 0   # 重试次数,这里失败后不需要重试
  template:
    metadata:
        annotations:
            sidecar.istio.io/inject: "false"
        labels:
            file-mount: "true"      # 这两个label必须加,kubeflow帮你自动配置一些基本环境
            user-mount: "true"
    spec:
      nodeSelector:
          gpu.device: "a100"
      tolerations:
        - key: role
          operator:  Equal
          value: [your group name]
          effect: NoSchedule
      containers:
        - name: sp
          image: "af2:v1.04"   # 统一用这个镜像,提供一个基础conda和cuda环境
          imagePullPolicy: Always
          resources:
            limits:
              cpu: 4
              memory: "64G"
              nvidia.com/gpu: 1
          command: [
            "/bin/sh",
            "-cl",
            "python -u [model_script]"]     # 执行的命令
          workingDir: "af2/"        # 默认的工作目录,就是你启动脚本的所在目录
          env:                      # 这是把每个pod的名字注入环境变量,以便能够在程序里区分当前是在哪一个pod中
            - name: PODNAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
      restartPolicy: Never
""")


@dsl.pipeline(
    name="psp-multimer-ag2-afm",
)
def job_pipeline(input_fasta_path, output_dir):
    job_msa = yaml.safe_load(msa_job_yaml.substitute(
        {
            'input_fasta_path': input_fasta_path,
            'output_dir': output_dir,
        }
    ))
    job_model = yaml.safe_load(model_job_yaml.substitute(
        {
            'input_fasta_path': input_fasta_path,
            'output_dir': output_dir,
        }
    ))
    print(f"[Info]: job_msa: {job_msa}")
    print(f"[Info]: job_model: {job_model}")
    msa = dsl.ResourceOp(name='psp-multimer-ag2-afm-msa', k8s_resource=job_msa,
                         set_owner_reference=True,
                         success_condition='status.conditions.0.type==Complete',
                         failure_condition='status.failed >0')

    model = dsl.ResourceOp(name='psp-multimer-ag2-afm-model', k8s_resource=job_model,
                           set_owner_reference=True,
                           success_condition='status.conditions.0.type==Complete',
                           failure_condition='status.failed >0')
    model.after(msa)


if __name__ == '__main__':
    kfp.compiler.Compiler().compile(job_pipeline, 'psp-multimer-ag2-afm.yaml')

运行脚本,生成 YAML 文件 psp-multimer-ag2-afm.yaml,即:

python afm_pipeline.py

运行日志:

[Info]: job_msa: {'apiVersion': 'batch/v1', 'kind': 'Job', 'metadata': {'name': 'afm-msa-search'}, 'spec': {'completions': 2, 'parallelism': 2, 'backoffLimit': 0, 'template': {'metadata': {'annotations': {'sidecar.istio.io/inject': 'false'}, 'labels': {'file-mount': 'true', 'user-mount': 'true'}}, 'spec': {'nodeSelector': {'service': 'ai2-msa-only'}, 'tolerations': [{'key': 'role', 'operator': 'Equal', 'value': 'ai2-msa-only', 'effect': 'NoSchedule'}], 'containers': [{'name': 'sp', 'image': 'af2:v1.04', 'imagePullPolicy': 'Always', 'resources': {'limits': {'cpu': '62', 'memory': '124G'}, 'requests': {'cpu': '62', 'memory': '124G'}}, 'command': ['/bin/sh', '-cl', 'python -u [msa_script]'], 'workingDir': 'af2/', 'env': [{'name': 'PODNAME', 'valueFrom': {'fieldRef': {'fieldPath': 'metadata.name'}}}]}], 'restartPolicy': 'Never'}}}}
[Info]: job_model: {'apiVersion': 'batch/v1', 'kind': 'Job', 'metadata': {'name': 'afm-model-infer'}, 'spec': {'completions': 2, 'parallelism': 2, 'backoffLimit': 0, 'template': {'metadata': {'annotations': {'sidecar.istio.io/inject': 'false'}, 'labels': {'file-mount': 'true', 'user-mount': 'true'}}, 'spec': {'nodeSelector': {'gpu.device': 'a100'}, 'tolerations': [{'key': 'role', 'operator': 'Equal', 'value': 'algo2', 'effect': 'NoSchedule'}], 'containers': [{'name': 'sp', 'image': 'af2:v1.04', 'imagePullPolicy': 'Always', 'resources': {'limits': {'cpu': 4, 'memory': '64G', 'nvidia.com/gpu': 1}}, 'command': ['/bin/sh', '-cl', 'python -u [model_script]'], 'workingDir': 'af2/', 'env': [{'name': 'PODNAME', 'valueFrom': {'fieldRef': {'fieldPath': 'metadata.name'}}}]}], 'restartPolicy': 'Never'}}}}

使用 Kubernetes 构建 Pipeline,上传生成的 YAML 文件,即:

Kubernetes

运行 Pipeline,即:

Runs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1947819.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

错误解决 error CS0117: ‘Buffer‘ does not contain a definition for ‘BlockCopy‘

Unity 2022.3.9f1 导入 Runtime OBJ Importer 后出现: error CS0117: ‘Buffer’ does not contain a definition for ‘BlockCopy’ 解决办法: 源代码: int DDS_HEADER_SIZE 128; byte[] dxtBytes new byte[ddsBytes.Length - DDS_HEAD…

深度学习系列一

激活函数 sigmod 梯度消失问题: sigmoid函数的导数在输入值较大或较小时接近于0。在反向传播过程中,这些小梯度会相乘,导致深层网络的梯度变得非常小。结果是,深层网络的参数几乎不会更新,训练变得非常困难。这就是为…

基于flask的天气数据可视化系统1.0

基于flask的天气数据可视化系统1.0 一、效果展示二、flask简介三、图表绘制四、前端页面编写五、完整代码一、效果展示 该flask项目相对简单入门,使用了flask框架、bootstrap前端技术,数据使用的是上一篇scrapy爬取城市天气数据中爬取到的数据。 二、flask简介 Flask是一个…

在linux中,如何搭建nacos2.4.0的版本,修改nacos密码

由于最近服务器经常被攻击,看了一下发现是nacos版本过低,导致被抓了肉鸡,导致服务器的网端被跑满,选择重新搭建nacos,进入服务器后,首先确定服务器是否安装java,先执行java -version&#xff0c…

如何应对SQL注入攻击?

引言 在现今的网络世界中,安全性已成为至关重要的话题。SQL注入(SQL Injection)是一种常见且危险的网络攻击方式,攻击者通过向SQL查询中插入恶意代码来操控数据库,从而获取敏感信息或破坏数据。了解SQL注入的各种类型…

【数据结构】建堆算法复杂度分析及TOP-K问题

【数据结构】建堆算法复杂度分析及TOP-K问题 🔥个人主页:大白的编程日记 🔥专栏:数据结构 文章目录 【数据结构】建堆算法复杂度分析及TOP-K问题前言一.复杂度分析1.1向下建堆复杂度1.2向上建堆复杂度1.3堆排序复杂度 二.TOP-K问…

C++高性能通信:了解Iceoryx与零拷贝技术的实现与应用

文章目录 0. 引言1. Iceoryx使用到的零拷贝技术1.1 零拷贝技术概述1.2 零拷贝的优势1.3 Iceoryx零拷贝的实现1.4 信息轮询与信号触发 2. Iceoryx的核心概念2.1 RouDi (iox-roudi)2.2 Runtime2.3 Publisher2.4 Subscriber2.5 Topic 3. Iceoryx使用示例3.1 发布者程序3.2 订阅者程…

1万+台网络设备运维如何选择支撑工具?

针对1万台网络设备的运维管理,需要采取一套系统化、自动化且高效的管理方法与策略。“工欲善其事,必先利其器”,以下结合一些关键步骤探讨运维支撑软件工具的方案。 1 建立完善的设备档案 设备信息记录: 为每台设备建立详细的…

科研成果 | 高精尖中心取得高性能区块链交易调度技术突破

近日,未来区块链与隐私计算高精尖创新中心研究团队在区块链交易效率方面取得突破性进展,最新成果“高性能区块链交易调度引擎”首次为长安链带来高并行度的交易调度,充分利用现有计算资源,显著提升长安链交易处理速度。 随着区块…

安卓单机游戏:《植物大战僵尸:重生》一款深受玩家喜爱的塔防游戏

一款深受玩家喜爱的塔防游戏,在这个游戏中,玩家需要通过种植不同类型的植物来阻止不断涌来的僵尸入侵,而每种植物都有自己的能力与特点,游戏画面和音效都非常出色,剧情也十分有趣,难度不断升级,…

JAVA代码审计JAVA0基础学习(需要WEB基础知识)DAY2

JAVA 在 SQL执行当中 分为3种写法: JDBC注入分析 Mybatis注入分析 Hibernate注入分析 JDBC 模式不安全JAVA代码示例部分特征 定义了一个 sql 参数 直接让用户填入id的内容 一个最简单的SQL语句就被执行了 使用安全语句却并没有被执行 Mybatis: #…

第13周 简历职位功能开发与Zookeeper实战

第13周 简历职位功能开发与Zookeeper实战 本章概述1. Mysql8窗口函数over使用1.1 演示表结构与数据1.2 案例1:获取男女总分数1.3 案例2****************************************************************************************本章概述 1. Mysql8窗口函数over使用 参考案例…

行业不同怎么选企业管理咨询公司

在选择企业管理咨询公司时,不同行业的企业往往面临着各自独特的挑战和需求。因此,选择一家适合自身行业特点、能够提供专业且有针对性的咨询服务的管理咨询公司至关重要。本文将从行业差异的角度出发,探讨如何根据企业所在行业的不同&#xf…

二维码的生成与识别(python)

二维码生成 from PIL import Image import qrcode from qrcode.image.styledpil import StyledPilImage from qrcode.image.styles.colormasks import SolidFillColorMask from qrcode.image.styles.moduledrawers import SquareModuleDrawer# 创建二维码对象 qr qrcode.QRCo…

智能编程,一触即发:使用AIGC优化CSS——提升前端开发效率与质量

文章目录 一、AIGC在CSS优化中的应用场景智能代码生成自动布局调整性能优化建议样式和色彩建议 二、使用AIGC优化CSS的具体步骤明确需求选择AIGC工具输入描述或设计稿审查和调整集成和测试 三、AIGC优化CSS的优势与挑战优势:挑战: 《CSS创意项目实践&…

vue3前端开发-小兔鲜项目-登录和非登录状态下的模板适配

vue3前端开发-小兔鲜项目-登录和非登录状态下的模板适配&#xff01;有了上次的内容铺垫&#xff0c;我们可以根据用户的token来判定&#xff0c;到底是显示什么内容了。 1&#xff1a;我们在对应的导航组件内修改完善一下内容即可。 <script setup> import { useUserSt…

ATE测试设备ATECLOUD专注于电源模块、电源芯片和射频组件测试

在追求效率与精度的时代背景下&#xff0c;电子测试测量行业迎来了ATE自动化测试设备的革新。这一设备的出现&#xff0c;不仅简化了测试流程&#xff0c;还大幅提高了测试的准确性和速度。 新ATE自动化测试设备&#xff1a;ATECLOUD测试平台 纳米软件深耕电测行业16年&#xf…

算法 day4 【双指针、快慢指针、环形链表】链表下

⚡刷题计划day4继续&#xff0c;可以点个免费的赞哦~ 下一期将会开启哈希表刷题专题&#xff0c;往期可看专栏&#xff0c;关注不迷路&#xff0c; 您的支持是我的最大动力&#x1f339;~ 目录 ⚡刷题计划day4继续&#xff0c;可以点个免费的赞哦~ 下一期将会开启哈希表刷题…

无法连接网络打印机0x00000709原因分析及多种解决方法

在日常办公和生活中&#xff0c;打印机是不可或缺的重要设备。然而&#xff0c;有时在连接打印机的过程中&#xff0c;我们可能会遇到错误代码0x00000709的提示。有更新补丁导致的、有访问共享打印机服务异常、有访问共享打印机驱动异常等问题导致的&#xff0c;针对访问共享打…

实验三 FPGA使用Verilog HDL设计加法器

实验目的 掌握使用Vivado软件进行设计、综合、仿真、布线的方法。掌握FPGA程序的下载方法。掌握使用Verilog HDL设计加法器的方法。 实验要求 采用Verilog HDL语言设计加法器&#xff0c;实现两个4位数的相加运算&#xff0c;并将结果通过LED灯或数码管显示出来。对设计进行综…