溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Kubeflow的使用方法

發(fā)布時(shí)間:2021-07-28 17:42:54 來(lái)源:億速云 閱讀:504 作者:chen 欄目:云計(jì)算

本篇內(nèi)容主要講解“Kubeflow的使用方法”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Kubeflow的使用方法”吧!

Kubeflow 使用指南

  • 本文根據(jù) https://github.com/openthings/kubeflow/blob/master/user_guide.md 翻譯。

  • 本文地址 https://my.oschina.net/u/2306127/blog/1808582,By openthings,2018.05.23.

Kubeflow的使用方法Kubeflow(https://github.com/kubeflow)是基于Kubernetes(https://kubernets.io,容器編排與管理服務(wù)軟件)和TensorFlow(https://tensorflow.org,深度學(xué)習(xí)庫(kù))的機(jī)器學(xué)習(xí)流程工具,使用Ksonnet進(jìn)行應(yīng)用包的管理。

本文簡(jiǎn)要介紹Kubeflow的部署和交互操作的基本概念和方法,對(duì)于Kubernetes、Tensorflow和Ksonnet 的了解對(duì)于本文內(nèi)容的理解將很有幫助,點(diǎn)擊下面的鏈接查看相關(guān)的內(nèi)容。

  • Kubernetes

  • Tensorflow

  • Ksonnet

對(duì)部署Kubeflow和運(yùn)行一個(gè)簡(jiǎn)單的訓(xùn)練任務(wù)的手把手教的例子,可以看這個(gè)教程( tutorial)。

環(huán)境要求

  • Kubernetes>=1.8, see here,安裝攻略 https://my.oschina.net/u/2306127/blog/1628082

  • ksonnet version 0.9.2. (查看 below 有對(duì)為什么使用ksonnet的解釋)

部署 Kubeflow

我們將使用Ksonnet來(lái)部署kubeflow到Kubernetes集群上,支持本地的和GKE、Azure中的集群。

初始化一個(gè)目錄,包含有ksonnet application。

ks init my-kubeflow

安裝Kubeflow packages到Ksonnet application中。

  • 這里有一些安裝腳本,https://github.com/openthings/kubernetes-tools/tree/master/kubeflow

# For a list of releases see:
# https://github.com/kubeflow/kubeflow/releases
VERSION=v0.1.2

cd my-kubeflow
ks registry add kubeflow github.com/kubeflow/kubeflow/tree/${VERSION}/kubeflow
ks pkg install kubeflow/core@${VERSION}
ks pkg install kubeflow/tf-serving@${VERSION}
ks pkg install kubeflow/tf-job@${VERSION}

創(chuàng)建Kubeflow core component. 這個(gè)core component 包括:

  • JupyterHub

  • TensorFlow job controller

ks generate core kubeflow-core --name=kubeflow-core

# Enable collection of anonymous usage metrics
# Skip this step if you don't want to enable collection.
# Or set reportUsage to false (the default).
ks param set kubeflow-core reportUsage true
ks param set kubeflow-core usageId $(uuidgen)

Ksonnet 允許參數(shù)化 Kubeflow的部署,可以按照需求設(shè)定。我們定義兩個(gè)環(huán)境變量:nocloud和cloud。

ks env add nocloud
ks env add cloud

環(huán)境變量 nocloud 用于 minikube和其它的標(biāo)準(zhǔn) k8s clusters,環(huán)境變量 cloud 用于GKE和Azure。

如果使用 GKE, 我們配置云計(jì)算環(huán)境的參數(shù)來(lái)使用 GCP的特征,如下:

ks param set kubeflow-core cloud gke --env=cloud

如果集群創(chuàng)建在 Azure 上,使用 AKS/ACS:

ks param set kubeflow-core cloud aks --env=cloud

如果創(chuàng)建時(shí)使用acs-engine來(lái)代替:

ks param set kubeflow-core cloud acsengine --env=cloud

然后我們?cè)O(shè)置 ${KF_ENV} 為 cloud 或 nocloud ,從而反映我們?cè)诒窘坛讨惺褂玫沫h(huán)境。

$ KF_ENV=cloud|nocloud
  • 缺水情況下,Kubeflow沒(méi)有持久化我們?cè)贘upyter notebook所做的工作。

  • 如果容器被銷毀或重新創(chuàng)建,所有的內(nèi)容,包括 notebooks 和其它的文件都會(huì)被刪除。

  • 為了持久化這些文件,用戶需要一個(gè)缺省的 StorageClass,在 persistent volumes 中定義。

  • 可以運(yùn)行下面的命令來(lái)檢查是否有了一個(gè) storage class。

kubectl get storageclass
  • 有了缺省的storage class定義的用戶,可以使用jupyterNotebookPVCMount參數(shù)去創(chuàng)建一個(gè)volume,將被掛載到notebook之中。

    ks param set kubeflow-core jupyterNotebookPVCMount /home/jovyan/work

     

    • 這里我們掛載卷到 /home/jovyan/work ,因?yàn)閚otebook一直以用戶jovyan來(lái)執(zhí)行。

    • 選中的目錄將被存儲(chǔ)到集群的缺省存儲(chǔ)上(典型地是永久磁盤)。

創(chuàng)建部署的命名空間(namespace)并且設(shè)為換的一部分??梢詫amespace設(shè)為更適合你自己的kubernetes cluster的名稱,如下。

NAMESPACE=kubeflow
kubectl create namespace ${NAMESPACE}
ks env set ${KF_ENV} --namespace ${NAMESPACE}

然后應(yīng)用該components到我們的Kubernetes cluster。

ks apply ${KF_ENV} -c kubeflow-core

任何時(shí)候,可以使用 ks show 探查特定的 ksonnet component在kubernetes的對(duì)象定義。

ks show ${KF_ENV} -c kubeflow-core

用法報(bào)告(Usage Reporting)

當(dāng)啟用時(shí),Kubeflow將使用 spartakus 報(bào)告匿名數(shù)據(jù),這是Kubernetes的一個(gè)匯報(bào)工具。Spartakus不會(huì)報(bào)告任何個(gè)人信息。查看 here 得到更多細(xì)節(jié)。這是完全志愿的行為,也可以可選將其關(guān)閉,如下所示:

ks param set kubeflow-core reportUsage false

# Delete any existing deployments of spartakus
kubectl delete -n ${NAMESPACE} deploy spartakus-volunteer

為了明確開(kāi)啟用法報(bào)告,設(shè)置 reportUsage 為 true,如下所示:

ks param set kubeflow-core reportUsage true

# Delete any existing deployments of spartakus
kubectl delete -n ${NAMESPACE} deploy spartakus-volunteer

報(bào)告數(shù)據(jù)是你對(duì)Kubeflow的顯著貢獻(xiàn)之一,所以請(qǐng)考慮將其開(kāi)啟。這些數(shù)據(jù)允許我們改善Kubeflow項(xiàng)目并且?guī)椭鶮ubeflow上開(kāi)展工作的企業(yè)評(píng)估其持續(xù)的投資。

你可以改進(jìn)數(shù)據(jù)質(zhì)量,通過(guò)給每一個(gè)Kubeflow deployment 一個(gè)單獨(dú)的ID。

ks param set kubeflow-core usageId $(uuidgen)

打開(kāi) Jupyter Notebook

這里的 kubeflow-core component 部署JupyterHub和對(duì)應(yīng)的load balancer service,查看狀態(tài)使用下面的 kubectl 命令行:

kubectl get svc -n=${NAMESPACE}

NAME               TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
...
tf-hub-0           ClusterIP      None            <none>        8000/TCP       1m
tf-hub-lb          ClusterIP      10.11.245.94    <none>        80/TCP         1m
...

缺水情況下,我們使用ClusterIPs來(lái)訪問(wèn)JupyterHub UI,在下面情況會(huì)有所改變:

  • NodePort (for non-cloud) ,通過(guò)指示:

    ks param set kubeflow-core jupyterHubServiceType NodePort
    ks apply ${KF_ENV}


  • LoadBalancer (for cloud) ,通過(guò)指示:

    ks param set kubeflow-core jupyterHubServiceType LoadBalancer
    ks apply ${KF_ENV}


但是,這將使 Jupyter notebook 開(kāi)放予Internet網(wǎng)絡(luò)(有潛在的安全風(fēng)險(xiǎn))。

本地連接到 Jupyter Notebook 可以使用:

PODNAME=`kubectl get pods --namespace=${NAMESPACE} --selector="app=tf-hub" --output=template --template="{{with index .items 0}}{{.metadata.name}}{{end}}"`
kubectl port-forward --namespace=${NAMESPACE} $PODNAME 8000:8000

然后,到瀏覽器中打開(kāi) http://127.0.0.1:8000,如果設(shè)置了代理,需要對(duì)該地址關(guān)閉 。

將看到一個(gè)提示窗口。

  1. 使用任何username/password登錄。

  2. 點(diǎn)擊 "Start My Server" 按鈕,將會(huì)打開(kāi)一個(gè)對(duì)話框。

  3. 選擇鏡像為CPU 或 GPU 類型,在 Image一項(xiàng)有菜單列出預(yù)構(gòu)建的Docker鏡像。也可以直接輸入Tensorflow的鏡像名稱,用于運(yùn)行。

  4. 分配內(nèi)存、CPU、GPU和其他的資源,根據(jù)需求而定。 (1 CPU 和 2Gi 內(nèi)存已經(jīng)是一個(gè)好的起點(diǎn),可以滿足初始練習(xí)的需要。)

    • 分配 GPUs, 需要確認(rèn)你的集群中有可用數(shù)量的 GPUs,GPU將會(huì)被容器實(shí)例獨(dú)占使用,如果資源不夠,該實(shí)例將會(huì)一直掛起,處于Pending狀態(tài)。

    • 檢查是否有足夠的nvidia gpus可用: kubectl get nodes "-o=custom-columns=NAME:.metadata.name,GPU:.status.allocatable.nvidia\.com/gpu"

    • 如果 GPUs 可用,你可以調(diào)度你的服務(wù)器到 GPU node,通過(guò)指定下面的json, 在 Extra Resource Limits section: {"nvidia.com/gpu": "1"}

  5. 點(diǎn)擊 Spawn

    • 這里 ${USERNAME} 是你 login時(shí)用到的名稱。

    • GKE users,如果你有 IAP turned on the pod,將會(huì)名稱有所不同:

      jupyter-accounts-2egoogle-2ecom-3USER-40DOMAIN-2eEXT


    • 如果登陸為像 USER@DOMAIN.EXT, pod 被命名為:

    • 該鏡像將近 10 GBs,下載需要比較長(zhǎng)的時(shí)間,取決于網(wǎng)絡(luò)情況。

    • 檢查 pod 的狀態(tài),通過(guò):

      kubectl -n ${NAMESPACE} describe pods jupyter-${USERNAME}


  6. 完成后,將會(huì)打開(kāi) Jupyter Notebook 初始界面。

上面提供的容器鏡像可以用于 Tensorflow models的訓(xùn)練,使用Jupyter即可操作。該鏡像包含所有需要的plugins, 包括 Tensorboard,可以用于對(duì)模型進(jìn)行豐富的可視化和探查分析。

未來(lái)測(cè)試安裝情況,我們運(yùn)行一個(gè)基本的hello world應(yīng)用 (來(lái)自 mnist_softmax.py )

from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

import tensorflow as tf

x = tf.placeholder(tf.float32, [None, 784])

W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))

y = tf.nn.softmax(tf.matmul(x, W) + b)

y_ = tf.placeholder(tf.float32, [None, 10])
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1]))

train_step = tf.train.GradientDescentOptimizer(0.05).minimize(cross_entropy)

sess = tf.InteractiveSession()
tf.global_variables_initializer().run()

for _ in range(1000):
  batch_xs, batch_ys = mnist.train.next_batch(100)
  sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))

粘貼上面的例子到新的 Python 3 Jupyter notebook,然后 shift+enter 執(zhí)行代碼。這里會(huì)得到基于測(cè)試數(shù)據(jù)的 0.9014 結(jié)果精度。

需要注意的是,運(yùn)行大多數(shù) cloud providers時(shí),public IP address 將會(huì)暴露到internet,并且缺省是沒(méi)有安全控制的endpoint。為了產(chǎn)品級(jí)部署,需要使用 SSL 和 authentication, 參考 documentation。

使用TensorFlow Serving提供model服務(wù)

我們將每一個(gè)部署的模型都作為APP中的 component 。

在云計(jì)算中創(chuàng)建一個(gè)模型的component:

MODEL_COMPONENT=serveInception
MODEL_NAME=inception
MODEL_PATH=gs://kubeflow-models/inception
ks generate tf-serving ${MODEL_COMPONENT} --name=${MODEL_NAME}
ks param set ${MODEL_COMPONENT} modelPath ${MODEL_PATH}

(或者) 創(chuàng)建一個(gè)model的component 在 nfs 上,了解和參考 components/k8s-model-server,如下:

MODEL_COMPONENT=serveInceptionNFS
MODEL_NAME=inception-nfs
MODEL_PATH=/mnt/var/nfs/general/inception
MODEL_STORAGE_TYPE=nfs
NFS_PVC_NAME=nfs
ks generate tf-serving ${MODEL_COMPONENT} --name=${MODEL_NAME}
ks param set ${MODEL_COMPONENT} modelPath ${MODEL_PATH}
ks param set ${MODEL_COMPONENT} modelStorageType ${MODEL_STORAGE_TYPE}
ks param set ${MODEL_COMPONENT} nfsPVC ${NFS_PVC_NAME}

部署model component。Ksonnet將選擇你的環(huán)境中的已存在的參數(shù) (e.g. cloud, nocloud),然后定制化結(jié)果部署為合適的:

ks apply ${KF_ENV} -c ${MODEL_COMPONENT}

之前, 一些pods和services已經(jīng)創(chuàng)建在你的集群中。你可以查詢kubernetes得到服務(wù)endpoint:

kubectl get svc inception -n=${NAMESPACE}
NAME        TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)          AGE
...
inception   LoadBalancer   10.35.255.136   ww.xx.yy.zz   9000:30936/TCP   28m
...

在這里,你可以使用的 inception_client 為 ww.xx.yy.zz:9000

在gs://kubeflow-models/inception 的model 是可以公開(kāi)訪問(wèn)的。但是,如果你的環(huán)境沒(méi)有配置google cloud credential,TF serving 將無(wú)法讀取model,查看 issue 獲取樣本。為了設(shè)置google cloud credential,你需要環(huán)境變量 GOOGLE_APPLICATION_CREDENTIALS 指向credential 文件,或者運(yùn)行 gcloud auth login. 查看 doc 獲取更多詳細(xì)說(shuō)明。

通過(guò) Seldon 服務(wù) model

Seldon-core 提供了任意機(jī)器學(xué)習(xí)運(yùn)行時(shí)的部署,將其 packaged in a Docker container。

安裝seldon package:

ks pkg install kubeflow/seldon

創(chuàng)建 core components:

ks generate seldon seldon

Seldon 允許復(fù)雜的 runtime graphs用于模型推理的部署。一個(gè) end-to-end整合的例子參見(jiàn) kubeflow-seldon example。更多的細(xì)節(jié)參考 seldon-core documentation。

提交一個(gè)TensorFlow訓(xùn)練任務(wù)

注意:在提交訓(xùn)練任務(wù)之前,你首先需要有一個(gè) deployed kubeflow to your cluster。提交訓(xùn)練任務(wù)時(shí),首先確認(rèn) TFJob custom resource 是可用的。

我們將每一個(gè)TensorFlow job作為APP中的 component 看待。

A、創(chuàng)建工作任務(wù)

為訓(xùn)練任務(wù)創(chuàng)建 component:

JOB_NAME=myjob
ks generate tf-job ${JOB_NAME} --name=${JOB_NAME}

為了配置這個(gè) job需要設(shè)置一系列的參數(shù)。為了查看參數(shù)列表,運(yùn)行:

ks prototype describe tf-job

參數(shù)設(shè)置使用 ks param ,設(shè)置 Docker image 使用:

IMAGE=gcr.io/tf-on-k8s-dogfood/tf_sample:d4ef871-dirty-991dde4
ks param set ${JOB_NAME} image ${IMAGE}

你可以編輯 params.libsonnet 文件,直接設(shè)置參數(shù)。

警告 由于escaping序列問(wèn)題,目前命令行的設(shè)置參數(shù)不能工作 (參見(jiàn) ksonnet/ksonnet/issues/235)。因此,設(shè)置參數(shù)需要直接編輯 params.libsonnet 文件。

B、運(yùn)行工作任務(wù)
ks apply ${KF_ENV} -c ${JOB_NAME}
C、監(jiān)視工作任務(wù)

監(jiān)視任務(wù)執(zhí)行情況,參見(jiàn) TfJob docs.

D、刪除工作任務(wù)
ks delete ${KF_ENV} -c ${JOB_NAME}
運(yùn)行例程-TfCnn

Kubeflow 附帶了一個(gè) ksonnet prototype ,適合運(yùn)行 TensorFlow CNN Benchmarks。

創(chuàng)建component:

CNN_JOB_NAME=mycnnjob
ks generate tf-cnn ${CNN_JOB_NAME} --name=${CNN_JOB_NAME}

提交任務(wù):

ks apply ${KF_ENV} -c ${CNN_JOB_NAME}

查看運(yùn)行情況 (注意 tf-cnn job 也是 tfjobs. 參考 TfJob docs)

kubectl get -o yaml tfjobs ${CNN_JOB_NAME}

刪除任務(wù):

ks delete ${KF_ENV} -c ${CNN_JOB_NAME}

該 prototype提供了一系列參數(shù)控制任務(wù)的運(yùn)行 (如使用 GPUs,分布式運(yùn)行等...)。查看參數(shù)運(yùn)行:

ks prototype describe tf-cnn

提交 PyTorch 訓(xùn)練任務(wù)

注意:在提交任務(wù)之前,你需要有一個(gè)部署好Kubeflow的集群(參見(jiàn) deployed kubeflow to your cluster)。提交,確保 PyTorchJob custom resource 可用。

我們將每一個(gè)PyTorch任務(wù)看作為APP中的 component 。

為工作任務(wù)創(chuàng)建一個(gè) component。

JOB_NAME=myjob
ks generate pytorch-job ${JOB_NAME} --name=${JOB_NAME}

為了配置工作任務(wù),需要設(shè)置一系列的參數(shù)。 顯示參數(shù)使用:

ks prototype describe pytorch-job

參數(shù)設(shè)置使用 ks param ,設(shè)置Docker image 使用:

IMAGE=<your pytorch image>
ks param set ${JOB_NAME} image ${IMAGE}

也可以編輯文件 params.libsonnet 來(lái)直接設(shè)置參數(shù)。

警告 由于escaping序列問(wèn)題,目前命令行的設(shè)置參數(shù)不能工作 (參見(jiàn) ksonnet/ksonnet/issues/235)。因此,設(shè)置參數(shù)需要直接編輯 params.libsonnet 文件。

運(yùn)行工作任務(wù):

ks apply ${KF_ENV} -c ${JOB_NAME}

刪除工作任務(wù):

ks delete ${KF_ENV} -c ${JOB_NAME}

高級(jí)定制

  • 數(shù)據(jù)科學(xué)家經(jīng)常要求一個(gè) POSIX 兼容的文件系統(tǒng):

    • 例如,大多數(shù)HDF5 libraries 要求 POSIX,對(duì)于GCS或S3的object store無(wú)法工作。

  • 當(dāng)共享 POSIX 文件系統(tǒng)被掛載到 notebook 環(huán)境,數(shù)據(jù)科學(xué)家可以在同一數(shù)據(jù)集上協(xié)同工作。

  • 這里將展示如何部署Kubeflow來(lái)達(dá)到這個(gè)要求。

設(shè)置磁盤參數(shù),以分號(hào)隔開(kāi),設(shè)置你想要掛載的 Google persistent disks。

  • 這些磁盤必須在你的集群的同一個(gè) zone 上。

  • 這些磁盤需要通過(guò) gcloud 或 Cloud console手動(dòng)創(chuàng)建。

  • 這些磁盤不能被引用到任何已存在的 VM 或 POD上。

創(chuàng)建磁盤:

  gcloud --project=${PROJECT} compute disks create  --zone=${ZONE} ${PD_DISK1} --description="PD to back NFS storage on GKE." --size=1TB
  gcloud --project=${PROJECT} compute disks create  --zone=${ZONE} ${PD_DISK2} --description="PD to back NFS storage on GKE." --size=1TB

配置環(huán)境來(lái)使用這些磁盤:

ks param set --env=cloud kubeflow-core disks ${PD_DISK1},${PD_DISK2}

部署環(huán)境。

ks apply cloud

啟動(dòng)Juptyer,你將可以看見(jiàn)你的 NFS volumes 掛載為 /mnt/${DISK_NAME}。在Juptyer cell中運(yùn)行:

!df

將看到如下的輸出:

https://github.com/jlewi/deepvariant_on_k8s
Filesystem                                                     1K-blocks    Used  Available Use% Mounted on
overlay                                                         98884832 8336440   90532008   9% /
tmpfs                                                           15444244       0   15444244   0% /dev
tmpfs                                                           15444244       0   15444244   0% /sys/fs/cgroup
10.11.254.34:/export/pvc-d414c86a-e0db-11e7-a056-42010af00205 1055841280   77824 1002059776   1% /mnt/jlewi-kubeflow-test1
10.11.242.82:/export/pvc-33f0a5b3-e0dc-11e7-a056-42010af00205 1055841280   77824 1002059776   1% /mnt/jlewi-kubeflow-test2
/dev/sda1                                                       98884832 8336440   90532008   9% /etc/hosts
shm                                                                65536       0      65536   0% /dev/shm
tmpfs                                                           15444244       0   15444244   0% /sys/firmware
  • 這里 jlewi-kubeflow-test1 和 jlewi-kubeflow-test2 是 PDs的名稱。

問(wèn)題解決

Minikube

在 Minikube ,Virtualbox/VMware drivers是已知在 KVM/KVM2 driver 和 TensorFlow Serving之間的問(wèn)題. 該問(wèn)題跟蹤在 kubernetes/minikube#2377。

我們建議增加 Minikube分配的資源總量,如下:

minikube start --cpus 4 --memory 8096 --disk-size=40g
  • Minikube 缺省分配 2048Mb RAM給虛擬機(jī),對(duì)于 JupyterHub是不夠的。

  • 最大的磁盤容量需要滿足 Kubeflow's Jupyter images,包含額外的庫(kù)超過(guò)10G以上。

如果遇到j(luò)upyter-xxxx pod 進(jìn)入Pending 狀態(tài),獲取描述信息:

Warning  FailedScheduling  8s (x22 over 5m)  default-scheduler  0/1 nodes are available: 1 Insufficient memory.
  • 然后嘗試重新創(chuàng)建 Minikube cluster (重新使用Ksonnet應(yīng)用 Kubeflow) ,并指定更多的資源。

RBAC clusters

如果你運(yùn)行的集群開(kāi)啟了RBAC(參考 RBAC enabled),,運(yùn)行Kubeflow可能遇到如下的錯(cuò)誤:

ERROR Error updating roles kubeflow-test-infra.jupyter-role: roles.rbac.authorization.k8s.io "jupyter-role" is forbidden: attempt to grant extra privileges: [PolicyRule{Resources:["*"], APIGroups:["*"], Verbs:["*"]}] user=&{your-user@acme.com  [system:authenticated] map[]} ownerrules=[PolicyRule{Resources:["selfsubjectaccessreviews"], APIGroups:["authorization.k8s.io"], Verbs:["create"]} PolicyRule{NonResourceURLs:["/api" "/api/*" "/apis" "/apis/*" "/healthz" "/swagger-2.0.0.pb-v1" "/swagger.json" "/swaggerapi" "/swaggerapi/*" "/version"], Verbs:["get"]}] ruleResolutionErrors=[]

該錯(cuò)誤指示沒(méi)有足夠的權(quán)限。在大多數(shù)情況下,解決這個(gè)問(wèn)題通過(guò)創(chuàng)建合適的 clusterrole binding 然后重新部署kubeflow:

kubectl create clusterrolebinding default-admin --clusterrole=cluster-admin --user=your-user@acme.com
  • 替換 your-user@acme.com 為在錯(cuò)誤信息提示的用戶名。

如果你使用 GKE, 你可以參考 GKE's RBAC docs 去了解如何設(shè)置 RBAC,通過(guò) IAM on GCP來(lái)實(shí)現(xiàn)。

spawning Jupyter pods的問(wèn)題

如果你 spawning jupyter notebooks遇到麻煩,檢查該 pod 是否已經(jīng)被調(diào)度運(yùn)行:

kubectl -n ${NAMESPACE} get pods
  • 查看啟動(dòng)juypter的pod名稱。

  • 如果使用username/password auth,Jupyter  pod 將被命名:

jupyter-${USERNAME}
  • 如果你使用 IAP on GKE,pod 將被命名為:

    jupyter-accounts-2egoogle-2ecom-3USER-40DOMAIN-2eEXT

     

    • 這里 USER@DOMAIN.EXT 是在使用IAP時(shí)的Google account。

一旦你知道pod的名稱:

kubectl -n ${NAMESPACE} describe pods ${PODNAME}
  • 查看events ,可以看到試圖schedule pod的錯(cuò)誤原因。

  • 無(wú)法schedule pod的常見(jiàn)原因是集群上沒(méi)有足夠的資源可用。

OpenShift

如果部署 Kubeflow 在 OpenShift 環(huán)境( 是對(duì) Kubernetes的封裝),你需要調(diào)整 security contexts,為了ambassador 和 jupyter-hub 部署的運(yùn)行。

oc adm policy add-scc-to-user anyuid -z ambassador
oc adm policy add-scc-to-user anyuid -z jupyter-hub

一旦安全策略設(shè)置好,你需要?jiǎng)h除失敗的pods 然后允許在 project deployment時(shí)可以重新創(chuàng)建。

你需要調(diào)整 tf-job-operator service 張好的權(quán)限,以使TFJobs能夠運(yùn)行。如下運(yùn)行一個(gè)TFJobs:

oc adm policy add-role-to-user cluster-admin -z tf-job-operator

Docker for Mac

Docker for Mac 社區(qū)版帶有Kubernetes支持 (1.9.2) ,可以從edge channel啟用。如果決定私用 Kubernetes environment on Mac,部署 Kubeflow時(shí)可能遇到如下的問(wèn)題:

ks apply default -c kubeflow-core
ERROR Attempting to deploy to environment 'default' at 'https://127.0.0.1:8443', but cannot locate a server at that address

該錯(cuò)誤是因?yàn)镈ocker for Mac安裝時(shí)設(shè)置的缺省集群為 https://localhost:6443.,一個(gè)選項(xiàng)是直接編輯創(chuàng)建的 environments/default/spec.json 文件設(shè)置 "server" 變量為正確的位置,然后重試部署。不過(guò),更好的方式是使用希望的kube config來(lái)創(chuàng)建Ksonnet app。

kubectl config use-context docker-for-desktop
ks init my-kubeflow

403 API rate limit 超出錯(cuò)誤

因?yàn)?ksonnet 使用 Github 拉取 kubeflow,除非用戶指定Github API token,將會(huì)快速消耗最大的 API 匿名調(diào)用限量,為了解決該問(wèn)題,可以創(chuàng)建 Github API token,參考這里 guide,,然后將該token 賦給GITHUB_TOKEN 環(huán)境變量。

export GITHUB_TOKEN=<< token >>

ks apply 產(chǎn)生錯(cuò)誤 "Unknown variable: env"

Kubeflow 要求版本 0.9.2 或更高,查看 see here。如果你運(yùn)行 ks apply 使用的老版本ksonnet,將得到錯(cuò)誤 Unknown variable: env ,如下所示:

ks apply ${KF_ENV} -c kubeflow-core
ERROR Error reading /Users/xxx/projects/devel/go/src/github.com/kubeflow/kubeflow/my-kubeflow/environments/nocloud/main.jsonnet: /Users/xxx/projects/devel/go/src/github.com/kubeflow/kubeflow/my-kubeflow/components/kubeflow-core.jsonnet:8:49-52 Unknown variable: env

  namespace: if params.namespace == "null" then env.namespace else params.namespace

檢查ksonnet 版本,如下:

ks version

如果 ksonnet版本低于 v0.9.2, 請(qǐng)升級(jí)并按照 user_guide 重新創(chuàng)建app。

為什么 Kubeflow 要使用 Ksonnet?

Ksonnet 是一個(gè)命令行工具,使管理包含多個(gè)部件的復(fù)雜部署變得更為容易,設(shè)計(jì)為與kubectl各自完成特定的操作。

Ksonnet 允許我們從參數(shù)化的模版中創(chuàng)建 Kubernetes manifests。這使參數(shù)化 Kubernetes manifests 用于特定的場(chǎng)景變得容易。在上面的例子中,我們?yōu)?TfServing 創(chuàng)建了manifests,為model提供用戶化的URI。

我蠻喜歡ksonnet的一個(gè)原因是,對(duì)待 environment  (如dev, test, staging, prod) 作為頭等的概念。對(duì)于每一個(gè)環(huán)境,我們部署同樣的 components只需要對(duì)特定環(huán)境有一些很小的定制化修改。我們認(rèn)為這對(duì)于通常的工作流來(lái)說(shuō)是非常友好的一種映射。例如,該特征讓在本地沒(méi)有GPU的情況下運(yùn)行任務(wù),使代碼運(yùn)行通過(guò),然后將其移到帶有大量GPU可規(guī)模伸縮的云計(jì)算環(huán)境之中。

到此,相信大家對(duì)“Kubeflow的使用方法”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI