MLOps - クックブック、第 1 章

MLOps - クックブック、第 1 章

こんにちは、みんな 私は CROC の CV 開発者です。 私たちは3幎前からCV分野のプロゞェクトを実斜しおきたした。 この間、私たちは倚くのこずを行いたした。たずえば、運転䞭に飲酒、喫煙、電話で話さないようにドラむバヌを監芖し、倢や雲を芋ずに道路を芋おいたした。 ; 私たちは、専甚車線を運転し、いく぀かの駐車スペヌスを占有する人々を蚘録したした。 劎働者がヘルメット、手袋などを着甚するこずを保蚌した。 斜蚭ぞの立ち入りを垌望しおいる埓業員を特定した。 私たちはできる限りすべおを数えたした。

私は䞀䜓䜕のためにこんなこずをしおいるのでしょうか

プロゞェクトを実行する過皋で、私たちは䜕床も困難に遭遇したす。その䞭には、皆さんがよく知っおいる、たたは将来知るこずになる問題のいく぀かもありたす。

状況をシミュレヌションしおみたしょう

私たちが、ML に関連した掻動を行っおいる若い䌁業「N」に就職したず想像しおみたしょう。 私たちは ML (DL、CV) プロゞェクトに取り組んでいたすが、その埌䜕らかの理由で別の仕事に切り替え、通垞は䌑憩をずり、自分自身たたは他の人のニュヌロンに戻りたす。

  1. 正念堎がやっお来たす。どこで停止したか、どのハむパヌパラメヌタを詊したか、そしお最も重芁なこずに、それらがどのような結果をもたらしたかを䜕らかの方法で思い出す必芁がありたす。 すべおの起動に関する情報を誰が保存するかに぀いおは、ヘッド、構成、メモ垳、クラりドの䜜業環境など、倚くのオプションがありたす。 ハむパヌパラメヌタがコヌド内でコメント行ずしお保存されおいるずきのオプションをたたたた目にしたしたが、これは䞀般的には空想です。 ここで、自分のプロゞェクトではなく、退職した人のプロゞェクトに戻り、model_1.pb ずいうコヌドずモデルを継承したずしたす。 写真を完成させ、すべおの痛みを䌝えるために、あなたも初心者の専門家であるず想像しおみたしょう。
  2. どうぞ。 コヌドを実行するには、私たちずコヌドを䜿甚しお䜜業する党員が環境を䜜成する必芁がありたす。 䜕らかの理由で圌らが圌を私たちの盞続財産ずしお残さなかったこずがよくありたす。 これも簡単ではない䜜業になる可胜性がありたす。 このステップで時間を無駄にしたくないですよね?
  3. モデル (自動車探知機など) をトレヌニングしたす。 非垞に良奜な状態になったので、結果を保存したす。 これを car_detection_v1.pb ず名付けたしょう。 次に、別の car_detection_v2.pb をトレヌニングしたす。 しばらくしお、私たちの同僚や私たち自身が、さたざたなアヌキテクチャを䜿甚しお教えるこずが増えおきたした。 その結果、倧量の成果物が圢成され、それらに関する情報を入念に収集する必芁がありたす (ただし、今のずころはより優先すべき事項があるため、これは埌で行いたす)。
  4. OK、もう終わりです モデルがいたす 次のモデルのトレヌニングを開始したり、新しい問題を解決するためのアヌキテクチャを開発したりできたすか? それずもお茶を飲みに行っおもいいですか? そしお誰が配備するのでしょうか

問題の特定

プロゞェクトや補品の開発には倚くの人が携わりたす。 そしお時間が経぀に぀れお、人が去ったり来たりし、プロゞェクトが増え、プロゞェクト自䜓がより耇雑になっおいきたす。 いずれにせよ、䞊蚘のサむクル (だけではありたせん) の状況は、特定の組み合わせで反埩ごずに発生したす。 これらすべおが時間の無駄、混乱、緊匵、そしおおそらく顧客の䞍満を匕き起こし、最終的にはお金の損倱に぀ながりたす。 私たちは普段、同じ叀い熊手を远いかけおいたすが、こうした瞬間を䜕床も繰り返し味わいたいず思う人はいないず思いたす。

MLOps - クックブック、第 1 章

したがっお、XNUMX ぀の開発サむクルを経お、解決する必芁がある問題があるこずがわかりたした。 これを行うには、次のものが必芁です。

  • 䜜業結果を䟿利に保存したす。
  • 新入瀟員を巻き蟌むプロセスを簡玠化する。
  • 開発環境の展開プロセスを簡玠化したす。
  • モデルのバヌゞョン管理プロセスを構成したす。
  • モデルを怜蚌する䟿利な方法がある。
  • モデル状態管理ツヌルを芋぀けたす。
  • モデルを本番環境に配信する方法を芋぀けたす。

このラむフサむクルを簡単か぀䟿利に管理できるワヌクフロヌを考案する必芁があるようですね? この実践は MLOps ず呌ばれたす

MLOps (機械孊習の DevOps) を䜿甚するず、デヌタ サむ゚ンス チヌムず IT チヌムが協力し、機械孊習モデルの監芖、怜蚌、ガバナンスを通じおモデルの開発ず展開のペヌスを高めるこずができたす。

あなたはできる 名誉Googleの人たちはこのこずに぀いおどう思っおいるのでしょうか この蚘事を芋るず、MLOps が非垞にボリュヌムのあるものであるこずがわかりたす。

MLOps - クックブック、第 1 章

この蚘事では、プロセスの䞀郚のみを説明したす。 実装には MLflow ツヌルを䜿甚したす。 これはオヌプン゜ヌス プロゞェクトであり、接続するには少量のコヌドが必芁で、䞀般的な ml フレヌムワヌクず統合されおいたす。 Kubeflow、SageMaker、Trains などの他のツヌルをむンタヌネットで怜玢するず、ニヌズに合ったツヌルが芋぀かるかもしれたせん。

MLFlow ツヌルの䜿甚䟋を䜿甚した MLOps の「構築」

MLFlow は、ML モデルのラむフサむクル管理のためのオヌプン゜ヌス プラットフォヌムです (https://mlflow.org/).

MLflow には XNUMX ぀のコンポヌネントが含たれおいたす。

  • MLflow Tracking - 結果ず、この結果に぀ながったパラメヌタの蚘録の問題に぀いお説明したす。
  • MLflow プロゞェクト - コヌドをパッケヌゞ化し、任意のプラットフォヌムで再珟できたす。
  • MLflow モデル - 本番環境ぞのモデルのデプロむを担圓したす。
  • MLflow レゞストリ - 集䞭リポゞトリにモデルを保存し、その状態を管理できたす。

MLflow は XNUMX ぀の゚ンティティで動䜜したす。

  • launch は、登録するトレヌニング、パラメヌタ、メトリクスの完党なサむクルです。
  • 実隓は䞀緒に実行される「トピック」です。

この䟋のすべおの手順は、Ubuntu 18.04 オペレヌティング システムに実装されおいたす。

1. サヌバヌを展開する

プロゞェクトを簡単に管理し、必芁な情報をすべお受け取るために、サヌバヌをデプロむしたす。 MLflow 远跡サヌバヌには XNUMX ぀の䞻芁コンポヌネントがありたす。

  • バック゚ンド ストア - 登録されたモデルに関する情報の保存を担圓したす (mysql、mssql、sqlite、postgresql の 4 ぀の DBMS をサポヌトしたす)。
  • アヌティファクト ストア - アヌティファクトの保存を担圓したす (Amazon S7、Azure Blob Storage、Google Cloud Storage、FTP サヌバヌ、SFTP サヌバヌ、NFS、HDFS の 3 ぀のストレヌゞ オプションをサポヌトしたす)。

ずしお アヌティファクトストア 簡単にするために、SFTP サヌバヌを䟋に挙げたす。

  • グルヌプを䜜成する
    $ sudo groupadd sftpg
  • ナヌザヌを远加し、そのナヌザヌのパスワヌドを蚭定したす
    $ sudo useradd -g sftpg mlflowsftp
    $ sudo passwd mlflowsftp 
  • いく぀かのアクセス蚭定を調敎する
    $ sudo mkdir -p /data/mlflowsftp/upload
    $ sudo chown -R root.sftpg /data/mlflowsftp
    $ sudo chown -R mlflowsftp.sftpg /data/mlflowsftp/upload
  • /etc/ssh/sshd_config に数行远加したす
    Match Group sftpg
     ChrootDirectory /data/%u
     ForceCommand internal-sftp
  • サヌビスを再起動する
    $ sudo systemctl restart sshd

ずしお バック゚ンドストア postgresqlを䜿っおみたしょう。

$ sudo apt update
$ sudo apt-get install -y postgresql postgresql-contrib postgresql-server-dev-all
$ sudo apt install gcc
$ pip install psycopg2
$ sudo -u postgres -i
# Create new user: mlflow_user
[postgres@user_name~]$ createuser --interactive -P
Enter name of role to add: mlflow_user
Enter password for new role: mlflow
Enter it again: mlflow
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) n
Shall the new role be allowed to create more new roles? (y/n) n
# Create database mlflow_bd owned by mlflow_user
$ createdb -O mlflow_user mlflow_db

サヌバヌを起動するには、次の Python パッケヌゞをむンストヌルする必芁がありたす (別の仮想環境を䜜成するこずをお勧めしたす)。

pip install mlflow
pip install pysftp

サヌバヌを起動したしょう

$ mlflow server  
                 --backend-store-uri postgresql://mlflow_user:mlflow@localhost/mlflow_db 
                 --default-artifact-root sftp://mlflowsftp:mlflow@sftp_host/upload  
                --host server_host 
                --port server_port

2. 远跡を远加する

私たちのトレヌニングの結果が倱われないように、将来の䞖代の開発者が䜕が起こっおいるのかを理解し、幎長の仲間や皆さんが孊習プロセスを冷静に分析できるようにするために、远跡を远加する必芁がありたす。 远跡ずは、パラメヌタ、メトリクス、アヌティファクト、およびトレヌニングの開始に関する远加情報をサヌバヌに保存するこずを意味したす。

たずえば、私は小さなものを䜜成したした github 䞊のプロゞェクト Keras に含たれるすべおのものをセグメント化する COCO デヌタセット。 远跡を远加するために、mlflow_training.py ファむルを䜜成したした。

最も興味深いこずが起こる行は次のずおりです。

def run(self, epochs, lr, experiment_name):
        # getting the id of the experiment, creating an experiment in its absence
        remote_experiment_id = self.remote_server.get_experiment_id(name=experiment_name)
        # creating a "run" and getting its id
        remote_run_id = self.remote_server.get_run_id(remote_experiment_id)

        # indicate that we want to save the results on a remote server
        mlflow.set_tracking_uri(self.tracking_uri)
        mlflow.set_experiment(experiment_name)

        with mlflow.start_run(run_id=remote_run_id, nested=False):
            mlflow.keras.autolog()
            self.train_pipeline.train(lr=lr, epochs=epochs)

        try:
            self.log_tags_and_params(remote_run_id)
        except mlflow.exceptions.RestException as e:
            print(e)

ここで、self.remote_server は、mlflow.tracking メ゜ッドの小さなラッパヌです。 MlflowClient (䟿宜䞊䜜成したした) を䜿甚しお実隓を䜜成し、サヌバヌ䞊で実行したす。 次に、起動結果をマヌゞする堎所を指定したす (mlflow.set_tracking_uri(self.tracking_uri))。 自動ロギング mlflow.keras.autolog() を有効にしたす。 珟圚、MLflow Tracking は TensorFlow、Keras、Gluon XGBoost、LightGBM、Spark の自動ログをサポヌトしおいたす。 フレヌムワヌクたたはラむブラリが芋぀からない堎合は、い぀でも明瀺的にログを蚘録できたす。 トレヌニングを開始しおいたす。 リモヌトサヌバヌにタグを登録し、パラメヌタを入力したす。

数行入力するだけで、他の人ず同じように、すべおの打ち䞊げに関する情報にアクセスできたす。 いいね

3. プロゞェクトを䜜成したす

次に、プロゞェクトを簡単に起動できるようにしたしょう。 これを行うには、MLproject ファむルず conda.yaml ファむルをプロゞェクト ルヌトに远加したす。
MLプロゞェクト

name: flow_segmentation
conda_env: conda.yaml

entry_points:
  main:
    parameters:
        categories: {help: 'list of categories from coco dataset'}
        epochs: {type: int, help: 'number of epochs in training'}

        lr: {type: float, default: 0.001, help: 'learning rate'}
        batch_size: {type: int, default: 8}
        model_name: {type: str, default: 'Unet', help: 'Unet, PSPNet, Linknet, FPN'}
        backbone_name: {type: str, default: 'resnet18', help: 'exampe resnet18, resnet50, mobilenetv2 ...'}

        tracking_uri: {type: str, help: 'the server address'}
        experiment_name: {type: str, default: 'My_experiment', help: 'remote and local experiment name'}
    command: "python mlflow_training.py 
            --epochs={epochs}
            --categories={categories}
            --lr={lr}
            --tracking_uri={tracking_uri}
            --model_name={model_name}
            --backbone_name={backbone_name}
            --batch_size={batch_size}
            --experiment_name={experiment_name}"

MLflow プロゞェクトにはいく぀かのプロパティがありたす。

  • 名前 - プロゞェクトの名前。
  • 環境 - 私の堎合、conda_env は、Anaconda が実行に䜿甚され、䟝存関係の説明が conda.yaml ファむルにあるこずを瀺したす。
  • ゚ントリ ポむント - どのファむルずどのパラメヌタを䜿甚しお実行できるかを瀺したす (すべおのパラメヌタはトレヌニングの開始時に自動的に蚘録されたす)

conda.yaml

name: flow_segmentation
channels:
  - defaults
  - anaconda
dependencies:
  - python==3.7
  - pip:
    - mlflow==1.8.0
    - pysftp==0.2.9
    - Cython==0.29.19
    - numpy==1.18.4
    - pycocotools==2.0.0
    - requests==2.23.0
    - matplotlib==3.2.1
    - segmentation-models==1.0.1
    - Keras==2.3.1
    - imgaug==0.4.0
    - tqdm==4.46.0
    - tensorflow-gpu==1.14.0

ランタむム環境ずしお docker を䜿甚できたす。詳现に぀いおは、を参照しおください。 ドキュメンテヌション.

4. トレヌニングを始めたしょう

プロゞェクトのクロヌンを䜜成し、プロゞェクト ディレクトリに移動したす。

git clone https://github.com/simbakot/mlflow_example.git
cd mlflow_example/

実行するにはラむブラリをむンストヌルする必芁がありたす

pip install mlflow
pip install pysftp

なぜならconda_env を䜿甚する䟋では、Anaconda をコンピュヌタにむンストヌルする必芁がありたす (ただし、必芁なパッケヌゞをすべお自分でむンストヌルし、起動パラメヌタをいじるこずでこれを回避できたす)。

すべおの準備手順が完了したので、トレヌニングを開始できたす。 プロゞェクトのルヌトから:

$ mlflow run -P epochs=10 -P categories=cat,dog -P tracking_uri=http://server_host:server_port .

コマンドを入力するずconda環境が自動䜜成され、トレヌニングが開始されたす。
䞊の䟋では、トレヌニング甚の゚ポック数、セグメント化するカテゎリを枡したした (完党なリストを参照できたす) ここで) ずリモヌトサヌバヌのアドレス。
䜿甚可胜なパラメヌタの完党なリストは、MLproject ファむルにありたす。

5. 孊習結果を評䟡する

トレヌニングが完了したら、ブラりザでサヌバヌのアドレスにアクセスできたす。 http://server_host:server_port

MLOps - クックブック、第 1 章

ここでは、すべおの実隓のリスト (巊䞊) ず実行に関する情報 (䞭倮) が衚瀺されたす。 起動ごずに、より詳现な情報 (パラメヌタ、メトリクス、アヌティファクト、およびいく぀かの远加情報) を衚瀺できたす。

MLOps - クックブック、第 1 章

メトリクスごずに倉曎履歎を芳察できたす

MLOps - クックブック、第 1 章

それらの。 珟時点では、結果を「手動」モヌドで分析できたす。たた、MLflow API を䜿甚しお自動怜蚌を蚭定するこずもできたす。

6. モデルを登録する

モデルを分析し、戊闘の準備ができおいるず刀断したら、登録に進みたす。このために、必芁な起動を遞択し (前の段萜で瀺したように)、䞋に進みたす。

MLOps - クックブック、第 1 章

モデルに名前を付けるず、バヌゞョンが決たりたす。 別のモデルを同じ名前で保存するず、自動的にバヌゞョンアップされたす。

MLOps - クックブック、第 1 章

モデルごずに説明を远加し、XNUMX ぀の状態 (ステヌゞング、実皌働、アヌカむブ) のいずれかを遞択できたす。その埌、API を䜿甚しおこれらの状態にアクセスできるため、バヌゞョン管理ず合わせお柔軟性がさらに高たりたす。

MLOps - クックブック、第 1 章

すべおのモデルにも簡単にアクセスできたす

MLOps - クックブック、第 1 章

ずそのバヌゞョン

MLOps - クックブック、第 1 章

前の段萜ず同様に、すべおの操䜜は API を䜿甚しお実行できたす。

7. モデルをデプロむする

この段階では、トレヌニング枈み (keras) モデルがすでにありたす。 䜿甚方法の䟋:

class SegmentationModel:
    def __init__(self, tracking_uri, model_name):

        self.registry = RemoteRegistry(tracking_uri=tracking_uri)
        self.model_name = model_name
        self.model = self.build_model(model_name)

    def get_latest_model(self, model_name):
        registered_models = self.registry.get_registered_model(model_name)
        last_model = self.registry.get_last_model(registered_models)
        local_path = self.registry.download_artifact(last_model.run_id, 'model', './')
        return local_path

    def build_model(self, model_name):
        local_path = self.get_latest_model(model_name)

        return mlflow.keras.load_model(local_path)

    def predict(self, image):
        image = self.preprocess(image)
        result = self.model.predict(image)
        return self.postprocess(result)

    def preprocess(self, image):
        image = cv2.resize(image, (256, 256))
        image = image / 255.
        image = np.expand_dims(image, 0)
        return image

    def postprocess(self, result):
        return result

ここでも、䟿宜䞊、self.registry は mlflow.tracking.MlflowClient の小さなラッパヌです。 重芁なのは、リモヌト サヌバヌにアクセスし、そこで指定された名前のモデルず最新の補品バヌゞョンを怜玢するこずです。 次に、アヌティファクトをロヌカルの ./model フォルダヌにダりンロヌドし、このディレクトリ mlflow.keras.load_model(local_path) からモデルをビルドしたす。 これでモデルを䜿甚できるようになりたした。 CV (ML) 開発者は、モデルを簡単に改善し、新しいバヌゞョンを公開できたす。

結論

私は次のこずを可胜にするシステムを玹介したした。

  • ML モデル、トレヌニングの進行状況、結果に関する情報を䞀元的に保存したす。
  • 開発環境を迅速に展開したす。
  • モデルの䜜業の進行状況を監芖および分析する。
  • モデルのバヌゞョン管理や状態管理に䟿利です。
  • 結果ずしお埗られたモデルをデプロむするのは簡単です。

この䟋はおもちゃであり、独自のシステムを構築するための出発点ずしお機胜したす。これには、結果の評䟡ずモデルの登録 (それぞれポむント 5 ず 6) の自動化が含たれる堎合がありたす。あるいは、デヌタセットのバヌゞョン管理などを远加するこずもありたす。 私が蚀いたかったのは、党䜓ずしお MLOps が必芁であり、MLflow は目的を達成するための手段にすぎないずいうこずです。

私が衚瀺しなかった、発生した問題に぀いお曞いおください。
ニヌズを満たすためにシステムに䜕を远加したすか?
問題のすべおたたは䞀郚を解決するためにどのようなツヌルやアプロヌチを䜿甚したすか?

PS いく぀かのリンクを残しおおきたす。
ギットハブプロゞェクト - https://github.com/simbakot/mlflow_example
MLflow - https://mlflow.org/
質問甚の仕事甚メヌル - [メヌル保護]

圓瀟は、IT スペシャリスト向けのさたざたなむベントを定期的に䞻催しおいたす。たずえば、8 月 19 日のモスクワ時間 00:XNUMX にオンラむン圢匏で CV ミヌトアップが開催されたす。興味があれば参加できたす。登録しおください。 ここで .

出所 habr.com

コメントを远加したす