かえるのプログラミングブログ

プログラミングでつまずいたところとその解決策などを書いていきます。

Python で学習した LightGBM model を使って Golang API で推論する

表題の内容について 勉強/実装 しました。

経緯など

諸事情で Go 言語をまっさらな状態から学ぶ必要があり、公式 tutorial を進めていく中でもう少し踏み込んだ実装をしたいと思いました.

巷では 機械学習API のバックエンドが Python ではなく Go やら Scala やらで動いているらしいということを聞き知っていたので、Python で学習させた model を Go で読み込んで Predict するようなコードを mac 上の docker コンテナ内で動かすというタスクは 一先ず tutorial の次の Step としては適当だろう (自分の目的にもまあ合致していそう) ということで実装しました。

ソースコードは以下の 2種類です。

いずれも README の通りに実行すれば 0からでも動くように書いたつもりなので変だ、うまくいかないみたいなことがありましたら @kaeru_nantoka まで優しく教えていただけると嬉しいです。

以下は実装した感想や気をつけたことなど書いていきます。

GoDockerEnv

  • Dockerfile

    • golang:latest というベースイメージから build するのですが、こちら os が debian ということで Centos7 と ubuntu しか仕事で使ったことのない筆者の見事触っていない os にあたりググる回数が微増しました.

    • VSCode の remote-container ? とかいうので簡単に環境構築できるらしい記事とかも見つけたのですが、build にありえん時間がかかり完了しなかったのでおとなしく Dockerfile から build しました.

    • 普段使いの vim と 色の設定を追加して完了です. (いつでも見慣れたターミナルで嬉しい!)

  • docker-compose.yml

    • Dockerfile だけのシンプルな構成です. ブラウザや CLI から API 叩きたいなどであればポート開けたり、DB 接続したりする必要があるのですが、今回は潜って作業ができればよかったので省略してます.
  • README に書いているように順番に実行してもらえれば go が実行できる環境に入れます.

GoTitanic

  • 本題の python で学習した LightGBM を Go で呼び出して predict するコードです.

    • Go LightGBM と雑にググって出てきた https://github.com/dmitryikh/leaves というライブラリを使用しています.

    • documentation がスーパー豪華で、こちらにあるサンプルコードを ↑ の環境で動かした(だけ) という仕上がりになっています.

    • 名前が titanic となっていて実際に使用しているのは乳がんデータセットと違うのですが、サンプルコード見つける前に漠然と titanic でやろうと思っていてすぐ後にサンプルコードを見つけ上記の目的であれば一旦乳がんデータセットで動かせばよかろうということで違っています

    • Next action で 簡単な特徴量エンジニアリング (性別の Encoding など) も Go で記述してその前処理後の X_test を model に渡すような実装もやってみるつもりです.

  • さて、ここで Python で学習した LightGBM model をこの docker 環境内に用意しなければならないことに気づいた私ですが、

    • LightGBM はおろか python すらインストールしていないことが発覚
    • c++ から build するのは面倒だ

    ということで、python と pip だけ入れて kaggle-api で自分の dataset から必要な学習済みモデルと サンプルコードを動かして作成した中間ファイルたちを持ってくることにしました(便利!) ついでに今まで温かみのあるコピペで kaggle.json などの setup をしていたのを .sh にまとめました.

    echo '{"username":"hogehuga","key":"piyopiyo"}' >> ~/.kaggle/kaggle.json のところは各自の kaggle.json に記述されている内容に読み替えてください

  • あとは predict_breast_cancer_model.go で予測してくれます。python コードとの比較はないですが、なかなか早いのではと思いました。

Future Work

  • テストコードを書く

  • train 時に X_train にやった feature engineering を X_test に対して Go 言語を使って行う

  • ポートを開けて curl や ブラウザから特徴量を渡して叩ける API のような使い方ができるようにする

  • XGBoost の IF もあるみたいなのでこちらも触る

感想/まとめ

  • mac 上の docker コンテナで動く python で学習した LightGBM を使って Go で推論できた

  • kaggle-api は超便利

  • 現場だとデータサイエンティストが作った model を API 実装者との間でどのようにやりとりしているのか (テストデータの特徴量エンジニアリングはサーバーサイドエンジニアがやっているのか?) などの疑問点が整理できてよかった

以上です。ありがとうございました。