Re:ゼロから始めるML生活

Standing on the shoulders of Giants

gokartを使ってみる

この前はluigiを使ってみてました。

www.nogawanogawa.com

この前参加したの勉強会で登壇者のみなさんがgokart激推しだったので、今回はエムスリーさんで開発されているgokartを使ってみたいと思います。

(エムスリーさん主催の勉強会で、登壇者の半分がエムスリーさんだったから激推しなのは当然っちゃ当然なんですが...)

なにはともあれ、やってみたいと思います。

gokart

github.com

gokartの説明は、エムスリーさんのブログが非常にわかりやすかったです。

www.m3tech.blog

あと、個人的にはこちらの記事も非常に参考にさせていただきました。

qiita.com

gokart周辺のライブラリも作られていて、

  • cookiecutter-gokart
    • プロジェクトテンプレートを作成するツール
  • thunderbolt
    • gokartが吐き出すログを読み込んで、実験条件を確認するツール
  • redshells
    • 再利用可能なgokartタスクがまとまったツール

がいずれもOSSで提供されています。

cookiecutter-gokart

cookiecutterが特定のライブラリに対する標準的なプロジェクトを作成してくれるライブラリで、それのgokart版ですね。 こちらは本格的に開発する際に、エンジニア間で認識の共通化ができるという点では非常に便利そうですね。

github.com

thunderbolt

機械学習プロジェクトでは、各タスクで複数回に渡ってパラメータを変更して実験を行ったり、日常的に走るBatchのモデルを取得したりといった場面に多く出くわします。gokartでの開発においては、それらのファイルを手元に設置、確認してPythonから読み込むという所作を簡単に行うために、thunderboltというOSSを公開しています。 機械学習プロジェクト向けPipelineライブラリgokartを用いた開発と運用 - エムスリーテックブログ

こちらは、主に実験管理を想定したライブラリだと理解しています。 こちらも実験管理が必要になるほど本格的に開発するようになると便利かと。

github.com

redshells

gokartのエコシステムとして、redshellsが提供されています。gokartの記事で、redshellsは下記のように紹介されています。

redshellsは、実際にエムスリーのプロダクションで動いている機械学習モデルのコードです。基本的なTF-IDFやtext embedding、xgboost、Matrix Factorizationといった手法からGraph Convolutional Neural Network等の比較的新しい手法まで、エムスリー内で使われる多くのモデルをgokartタスク化し公開しています。

Preferred Networksさんが公開しているOptunaにも一部対応しており、基本的には、パラメータなどの複雑な事を考えずpipelineを組めばモデルが出来るようなライブラリとなっています。 機械学習プロジェクト向けPipelineライブラリgokartを用いた開発と運用 - エムスリーテックブログ

github.com

使ってみる

さてようやく本題です。 今回はこちらのgokartを使って書き方について確認したいと思います。

題材:SCDV

テーマどうしようかなと思ったんですが、一つ一つがそれなりに時間がかかったり、複雑になりがちなNLP系のタスクにしてみたいと思います。 運が良いことに、SCDVのサンプルコードがあったので、そちらを参考に見ていきたいと思います。

元ネタとしては、こちら2つの記事を参考にさせていただいております。

qiita.com

qiita.com

フロー

参考にさせていただいた処理のフローは、読んだ感じこのような流れになっていました。

  1. テキストファイルを読み込み、単語に分割
  2. SCDVで学習(Embeddingの作成)
  3. 文書分類用に1.で読み込んだテキストファイルを形式調整
  4. 分類タスクについてLGBMで学習(classはもともとのデータセットの雑誌名を使用)
  5. 実際の分類精度の算出

コーパスには、毎回おなじみのlivedoor news corpusを使用しています。

www.rondhuit.com

luigiでの実装

まずはベースになるluigiの実装を見ていきます。

gokartを使った実装

参考にさせていただいたコードはluigiですでに実装されていたので、それをgokartで書き直すとこんな感じですかね。

もともとluigiで記述されているので、比較すると、outputが基本的には必要なくなります。 自動的にクラス名と各種パラメータからpklファイルを生成するため、outputの指定を省略することが出来ます。 あとはそんなに変わらないで書けるので、luigiを使っていた方には簡単に使えるかと思います。

redshellsを使った実装

最後にredshellsを使った実装だとこんな感じですね。

上の実装と比較するとTrainSCDVの部分でredshellsを使っています。 上の実装では中身まで実装しないといけませんが、こちらではそこの実装をライブラリで代用できます。

github

実際に使ったファイルについてはこちら。

github.com

感想

この手のワークフローライブラリは他にもたくさんあって、最近だとmetaflowとか出ましたし、なんだかワークフローライブラリ戦国時代って感じがします。 gokartはluigiをラップしているので、luigiの特徴が残りつつ、luigiより簡潔に書けるといった印象でした。 他のライブラリと比較したわけではありませんが、それでもすんなり使えたので良いと思いました。

勉強になりました。