最近又开始鼓捣kubeflow了,这个看过我文章的话应该有印象,基本上就是去年同期的时候搞过一段时间,后来因为太忙搁置了下来,最近因为项目的需要,可能需要用到这个kubeflow平台,所以又重新捡起来了。
作为一个新手,我的直观理解就是,kubeflow本质就是一个流程编排的工具,底层是基于Argoflow实现的工作流的定义,而定义的工具或者是说途径就是自己提交的pipeline.yaml文件,所有的执行细节和步骤全部都定在这个yaml文件中了。
之前我的方式就是首先开发各个节点的业务代码,之后开发pipeline文件,然后借助于kfp模块提供的dsl-compile编译命令来实现pipeline.yaml文件的编译生成。之后手工在kubeflow平台中提交生成的yaml文件即可,如下:
点击红框中的【Upload Pipeline】之后跳转如下:
按照我这里给出来的1-3步骤操作即可完成pipeline.yaml的上传提交。
之后在runs下可以创建run,如下:
后面就是页面端的操作了,我就不再赘述了。
今天主要讲的不是这些操作,这是手工页面的操作方式,那么有没有可以不用页面直接后端操作呢?当然是可以的了,kubeflow自己提供了可以调用其API的SDK,名字为:kfp,安装kfp后可以实例化client,之后就可以操作了。
这里官方的样例代码如下:
import kfp
client = kfp.Client(host='https://localhost:3000/')
client = kfp.Client()
print(client.list_experiments())
终端执行后报错如下:
提示认证有问题,然后报的连接错误,这个其实也好理解,自己搭建的kubeflow平台,在域名、ip等部分都做了映射和修改所以直接使用默认的localhost和3000端口,大概率是不可能连接到的,所以这里就报错了。
我修改成自己的IP和PORT之后重新执行报错如下:
下面的两个报错提示可能是很多很多折腾这个kubeflow的人都会遇上的错误,如下:
错误一:
kfp_server_api.exceptions.ApiException: (400)
错误二:
"Invalid input error: Invalid resource references for experiment. Namespace is empty."
说白了,这里是你能成功连接到自己的集群服务了,但是api服务异常了。
仔细分析其实第二个错误是比较好理解,就是说你的client实例化里面要指定一下自己的namespace,不然的话不知道进入到哪个namespace下,如果你有多个的话。
错误一的话查了很多的资料最后确定是api请求的有问题,应该在端口后面加上pipeline才行。样例如下:
client = kfp.Client(
host=f"{HOST:PORT}/pipeline",
cookies=session_cookie,
namespace=NAMESPACE,
)
需要加入自己的认证cookie和当前的namespace才行。
重新执行终于成功了。执行如下代码,打印实验信息:
print(client.list_experiments(namespace='kubeflow-user-example-com'))
要记得这里也是需要加上自己的namespace的。
输出的experimen信息如下:
问题成功解决,记录一下!