ormb機(jī)器學(xué)習(xí)模型管理組件
ormb(OCI-Based Registry for ML/DL Model Bundle)是基于鏡像倉(cāng)庫(kù)的機(jī)器學(xué)習(xí)模型分發(fā)組件,旨在幫助企業(yè)像管理容器鏡像一樣管理機(jī)器學(xué)習(xí)模型。它不僅提供版本化的模型管理能力,還可利用符合 OCI 標(biāo)準(zhǔn)的容器鏡像倉(cāng)庫(kù)存儲(chǔ)和分發(fā)機(jī)器學(xué)習(xí)模型。通過 Harbor 2.0,它可以實(shí)現(xiàn)在多個(gè)鏡像倉(cāng)庫(kù)間的同步,滿足更多企業(yè)級(jí)需求。
基于這個(gè)項(xiàng)目,才云之后會(huì)繼續(xù)開源基于 Harbor 實(shí)現(xiàn)的模型倉(cāng)庫(kù),提供更多能力。其中包括但不限于模型的格式轉(zhuǎn)換、模型自動(dòng)壓縮等高級(jí)特性。
端到端的示例
我們以圖像識(shí)別作為示例,介紹一下如何利用 ormb 進(jìn)行機(jī)器學(xué)習(xí)模型的分發(fā)。
在這一示例中,我們會(huì)在本地利用 Fashion MNIST 訓(xùn)練一個(gè)簡(jiǎn)單的 CNN 圖像識(shí)別模型,并利用 ormb 將其推送到遠(yuǎn)端鏡像倉(cāng)庫(kù)中。隨后,在服務(wù)器上,我們同樣利用 ormb 將模型拉取下來,利用第三方的模型服務(wù)器對(duì)外提供服務(wù)。最后,我們?cè)倮?RESTful 的接口調(diào)用這一服務(wù),查看結(jié)果。
下方是模型訓(xùn)練的代碼,我們將訓(xùn)練好的模型保存為 SavedModel 格式,并將模型提供在 ormb 示例中:
# 建立模型,設(shè)定 Optimizer,進(jìn)行訓(xùn)練
model = keras.Sequential([
keras.layers.Conv2D(input_shape=(28,28,1),
filters=8,
kernel_size=3,
strides=2,
activation='relu',
name='Conv1'),
keras.layers.Flatten(),
keras.layers.Dense(10,
activation=tf.nn.softmax,
name='Softmax')
])
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
model.fit(train_images, train_labels, epochs=epochs)
test_loss, test_acc = model.evaluate(test_images,
test_labels)
import tempfile
# 保存模型到當(dāng)前目錄的 model 子目錄下
MODEL_DIR = "./model"
version = 1
export_path = os.path.join(MODEL_DIR, str(version))
tf.keras.models.save_model(
model,
export_path,
overwrite=True,
include_optimizer=True,
save_format=None,
signatures=None,
options=None
)
接下來,我們將在本地訓(xùn)練好的模型推送到遠(yuǎn)端鏡像倉(cāng)庫(kù)中:
# 將模型保存在本地文件系統(tǒng)的緩存中
$ ormb save ./model gaocegege/fashion_model:v1
ref: gaocegege/fashion_model:v1
digest: 6b08cd25d01f71a09c1eb852b3a696ee2806abc749628de28a71b507f9eab996
size: 162.1 KiB
format: SavedModel
v1: saved
# 將保存在緩存中的模型推送到遠(yuǎn)端倉(cāng)庫(kù)中
$ ormb push gaocegege/fashion_model:v1
The push refers to repository [gaocegege/fashion_model]
ref: gaocegege/fashion_model:v1
digest: 6b08cd25d01f71a09c1eb852b3a696ee2806abc749628de28a71b507f9eab996
size: 162.1 KiB
format: SavedModel
v1: pushed to remote (1 layer, 162.1 KiB total)
以 Harbor 為例,在 Harbor 鏡像倉(cāng)庫(kù)中,我們可以看到這一模型的元數(shù)據(jù)等信息:
隨后,我們可以在服務(wù)器上將模型下載下來,模型下載過程與推送到鏡像倉(cāng)庫(kù)的方法類似:
# 從遠(yuǎn)端倉(cāng)庫(kù)拉取到服務(wù)器的本地緩存
$ ormb pull gaocegege/fashion_model:v1
v1: Pulling from gaocegege/fashion_model
ref: gaocegege/fashion_model:v1
digest: 6b08cd25d01f71a09c1eb852b3a696ee2806abc749628de28a71b507f9eab996
size: 162.1 KiB
Status: Downloaded newer model for gaocegege/fashion_model:v1
# 將本地緩存的模型導(dǎo)出到當(dāng)前目錄
$ ormb export gaocegege/fashion_model:v1
ref: localhost/gaocegege/fashion_model:v1
digest: 6b08cd25d01f71a09c1eb852b3a696ee2806abc749628de28a71b507f9eab996
size: 162.1 KiB
$ tree ./model
model
└── 1
├── saved_model.pb
└── variables
├── variables.data-00000-of-00001
└── variables.index
2 directories, 3 files
接下來,我們就可以利用 TFServing 將模型部署為 RESTful 服務(wù),并利用 Fashion MNIST 數(shù)據(jù)集的數(shù)據(jù)進(jìn)行推理:
$ tensorflow_model_server --model_base_path=$(pwd)/model --model_name=fashion_model --rest_api_port=8501
2020-05-27 17:01:57.499303: I tensorflow_serving/model_servers/server.cc:358] Running gRPC ModelServer at 0.0.0.0:8500 ...
[evhttp_server.cc : 238] NET_LOG: Entering the event loop ...
2020-05-27 17:01:57.501354: I tensorflow_serving/model_servers/server.cc:378] Exporting HTTP/REST API at:localhost:8501 ...
或者,我們也可以使用 Seldon Core 將模型服務(wù)直接部署在 Kubernetes 集群上,具體可以參見我們提供的文檔:
apiVersion: machinelearning.seldon.io/v1alpha2
kind: SeldonDeployment
metadata:
name: tfserving
spec:
name: mnist
protocol: tensorflow
predictors:
- graph:
children: []
implementation: TENSORFLOW_SERVER
modelUri: demo.goharbor.io/tensorflow/fashion_model:v1
serviceAccountName: ormb
name: mnist-model
parameters:
- name: signature_name
type: STRING
value: predict_images
- name: model_name
type: STRING
value: mnist-model
name: default
replicas: 1
算法工程師迭代新版本的模型時(shí),可以打包新的版本,利用 ormb 拉取新的鏡像后重新部署。ormb 可以配合任何符合 OCI Distribution Specification 的鏡像倉(cāng)庫(kù)使用,這意味著 ormb 支持公有云上的鏡像倉(cāng)庫(kù)和 Harbor 等開源鏡像倉(cāng)庫(kù)項(xiàng)目。
我們也可以利用 Harbor 提供的 Webhook 功能,實(shí)現(xiàn)模型服務(wù)的持續(xù)部署。通過在 Harbor UI 中注冊(cè)一個(gè) Webhook,所有對(duì) Harbor 的推送模型請(qǐng)求事件都會(huì)被轉(zhuǎn)發(fā)到我們定義的 HTTP Endpoint 上。而我們可以在 Webhook 中實(shí)現(xiàn)對(duì)應(yīng)的部署邏輯,比如根據(jù)新的模型來更新 Seldon 部署模型服務(wù)的版本,實(shí)現(xiàn)模型服務(wù)的持續(xù)部署等。
