Передача 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)но тоже не получилось.

0 ответов

Другие вопросы по тегам