Передача uri модели в развертывание ядра seldon в kubeflow (локально)
Я пытаюсь передать uri модели, который хранится в компоненте kubeflow, в качестве выходного пути. К редкому развертыванию ядра
Это код, который обучает модель и выводит путь к файлу в виде файла joblib. Согласно основной документации seldon, чтобы передать модель для использования предварительно упакованного сервера SKLearn, я должен упаковать ее в joblib.
def train(file_path: InputPath('parquet'), model_path: OutputPath('joblib')):
import numpy as np
import pandas as pd
from joblib import dump
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
from sklearn.model_selection import KFold
data = pd.read_parquet(file_path)
features = ['alcohol', 'malic_acid', 'ash', 'alcalinity_of_ash', 'magnesium', 'total_phenols', 'flavanoids',
'nonflavanoid_phenols', 'proanthocyanins', 'color_intensity', 'hue', 'od280/od315_of_diluted_wines',
'proline']
X = data[features]
y = data['target']
kf = KFold(
n_splits=3,
shuffle=True,
random_state=42
)
scores = []
for train_index, test_index in kf.split(X):
X_train, X_test = X.loc[train_index], X.loc[test_index]
y_train, y_test = y.loc[train_index], y.loc[test_index]
clf = RandomForestClassifier(n_estimators=1000)
clf.fit(X_train, y_train)
y_predict = clf.predict(X_test)
acc_score = round(accuracy_score(y_test, y_predict),3)
print(acc_score)
scores.append(acc_score)
print("Average:", round(100*np.mean(scores), 3), "%")
print("Std:", round(100*np.std(scores), 3), "%")
model_path = dump(clf, 'model.joblib')
Затем у меня есть файл deploy.py, который принимает входной путь и использует jinja, помещая модель uri в файл deploy-manifes.j2.
def deploy(model_path: InputPath('String')):
with open("/tmp/manifest.yaml", "w") as f:
env = Environment(loader=FileSystemLoader('./templates'),
trim_blocks=True, lstrip_blocks=True)
template = env.get_template('deploy-manifest.j2')
rendered = template.render(model_uri=model_uri)
print("Rendered Manifest:")
print(rendered)
f.write(rendered)
result = subprocess.call(
['kubectl', 'apply', '-f', '/tmp/manifest.yaml', '-n', 'admin'])
assert result == 0
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Data processor')
parser.add_argument('--model_uri', help='Model URI')
args = parser.parse_args()
deploy(args.model_uri)
файл развертывания-manifest.j2. Это файл, который я использую для развертывания развертывания seldon в развертывании kubeflow.
apiVersion: machinelearning.seldon.io/v1alpha2
kind: SeldonDeployment
metadata:
name: sklearn
spec:
name: model
predictors:
- graph:
children: []
implementation: SKLEARN_SERVER
modelUri: {{ model_uri }}
name: classifier
name: default
replicas: 1
И это файл компонента, который я использую для создания компонента kubeflow. Образ Docker — это мой собственный образ, который я разместил в концентраторе докеров, который запускает развертывание.
name: Deploy model
description: deploy model using seldon core
inputs:
- { name: model_uri, type: String, description: 'SKlearn model artifact URI' }
implementation:
container:
image: minio999/kubeflow-seldon@sha256:dc241b71182232d4deb35773e5f28c81436b0b4705a3f808112e82aae6316d4d
command: [
python3,
src/deploy.py,
--model_uri,
{ inputValue: model_uri }
]
Ошибка естьIncompatible argument passed to the input "model_uri" of component "Deploy model": Argument type "joblib" is incompatible with the input type "String"
Я пытался
Поэтому я попытался поменять InputPath('joblib') на InputPath('String') так же, как с OutputPath. Также попытался вручную заменить joblib на строку, используяmodel_uri = str(model_uri)
и model_uri = '' model_uri.join(model_path)
но тоже не получилось.