ormb機器學習模型管理組件
ormb(OCI-Based Registry for ML/DL Model Bundle)是基于鏡像倉庫的機器學習模型分發(fā)組件,旨在幫助企業(yè)像管理容器鏡像一樣管理機器學習模型。它不僅提供版本化的模型管理能力,還可利用符合 OCI 標準的容器鏡像倉庫存儲和分發(fā)機器學習模型。通過 Harbor 2.0,它可以實現(xiàn)在多個鏡像倉庫間的同步,滿足更多企業(yè)級需求。
基于這個項目,才云之后會繼續(xù)開源基于 Harbor 實現(xiàn)的模型倉庫,提供更多能力。其中包括但不限于模型的格式轉(zhuǎn)換、模型自動壓縮等高級特性。
端到端的示例
我們以圖像識別作為示例,介紹一下如何利用 ormb 進行機器學習模型的分發(fā)。
在這一示例中,我們會在本地利用 Fashion MNIST 訓練一個簡單的 CNN 圖像識別模型,并利用 ormb 將其推送到遠端鏡像倉庫中。隨后,在服務(wù)器上,我們同樣利用 ormb 將模型拉取下來,利用第三方的模型服務(wù)器對外提供服務(wù)。最后,我們再利用 RESTful 的接口調(diào)用這一服務(wù),查看結(jié)果。
下方是模型訓練的代碼,我們將訓練好的模型保存為 SavedModel 格式,并將模型提供在 ormb 示例中:
# 建立模型,設(shè)定 Optimizer,進行訓練
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
# 保存模型到當前目錄的 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
)
接下來,我們將在本地訓練好的模型推送到遠端鏡像倉庫中:
# 將模型保存在本地文件系統(tǒng)的緩存中
$ ormb save ./model gaocegege/fashion_model:v1
ref: gaocegege/fashion_model:v1
digest: 6b08cd25d01f71a09c1eb852b3a696ee2806abc749628de28a71b507f9eab996
size: 162.1 KiB
format: SavedModel
v1: saved
# 將保存在緩存中的模型推送到遠端倉庫中
$ 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 鏡像倉庫中,我們可以看到這一模型的元數(shù)據(jù)等信息:
隨后,我們可以在服務(wù)器上將模型下載下來,模型下載過程與推送到鏡像倉庫的方法類似:
# 從遠端倉庫拉取到服務(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
# 將本地緩存的模型導出到當前目錄
$ 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ù)進行推理:
$ 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
算法工程師迭代新版本的模型時,可以打包新的版本,利用 ormb 拉取新的鏡像后重新部署。ormb 可以配合任何符合 OCI Distribution Specification 的鏡像倉庫使用,這意味著 ormb 支持公有云上的鏡像倉庫和 Harbor 等開源鏡像倉庫項目。
我們也可以利用 Harbor 提供的 Webhook 功能,實現(xiàn)模型服務(wù)的持續(xù)部署。通過在 Harbor UI 中注冊一個 Webhook,所有對 Harbor 的推送模型請求事件都會被轉(zhuǎn)發(fā)到我們定義的 HTTP Endpoint 上。而我們可以在 Webhook 中實現(xiàn)對應(yīng)的部署邏輯,比如根據(jù)新的模型來更新 Seldon 部署模型服務(wù)的版本,實現(xiàn)模型服務(wù)的持續(xù)部署等。
