メモ帳

python, juliaで機械学習をやっていく

2020年やったこと

2020年の振り返りをしたいと思います。業務で扱った内容については書きません。

2020年は人生初の転職をしたのが一番のビッグイベントです。 非情報系の大学院を中退してすぐに未経験MLエンジニアとしてベンチャー中途採用してもらったのがキャリアのスタートで、そこから2年も経たずに辞めました。 世にある転職エントリーと比べると何も考えずに転職に至っています (笑)

アウトプット

今年アウトプットしたものを供養しますまとめます。 着手し始めのものも含まれています。

2020年はほとんどGitHubとQiitaにだけ出没していました。

  • 2020/01/02

qiita.com

PythonのWebフレームワークの整理とパフォーマンス比較を行いました。この記事を書く一年ぐらい前に本記事と全く同じ方法でDjangoとFlaskのパフォーマンス比較を行っていました。Qiitaに投稿し始めた頃だったので、注目されていそうなフレームワークを加えて再検証した結果をまとめたものです。残念ながら使用したPCが現在手元にないので再現不可能になっています。誰でも再現できるように検証コードの簡易化や適当なVMでの再測定をやりたいと密かに思いつつも手付かずです。

  • 2020/01/03

qiita.com

上記の記事で最もパフォーマンスの良かったFastAPIに入門したので、備忘録的に最低限の記法をまとめました。当時、似たフレームワークであるResponderで、開発したMLエンジンのデモアプリを作ることが多く、その代替をするつもりで入門しました。Webアプリとしては機能がかるいので、比較的楽に移行できました。

  • 2020/02/12

github.com

日本語のNLPの前処理によく使う処理をまとめたライブラリを公開しました。とはいえ機能は少なくて、全角半角の変換と括弧内の文字の削除だけです。GithubでCI構築・Pypiへの公開を初めて行いました。特にアクセスされておらず、あまり良い構想も思いついていないので公開後更新していません。

  • 2020/03/30

github.com

Python (Django) の学び初めにつくった日常ブログアプリ (Django 2.x + JQuery)をFastAPI + Nuxt.jsで作り直しました (実際は、変更点が多すぎて記事だけ移行した別物)。今でも、個人的に使っています。

Django REST Framework + React.jsの開発経験があり (主にバックエンド担当で、Reactは少し修正する程度) 、フロントエンドとバックエンドが切り離されていないと開発できない体になっているので、個人開発向けの構成に少しアレンジして作り替えました。さらに、テストを書いたり、CI/CDを構築したり、メール配信をSendGridにしたりといったアップデートもしています。

FastAPIが非常に使いやすい反面、SQLAlchemyに苦戦しました。RESTfulなAPIをたてる場合は、DRFの方が優れているなと感じています。 Nuxt.jsは全く使いこなせていないです。Qiitaなどの記事を見ても情報の取捨選択ができないので、細かいことは諦めて、公式チュートリアルに載っている例からUI/UXを決めました。

  • 2020/04/21

qiita.com

機械学習モデルの推論web APIサーバーの構成の典型例を記事にしました。重いモデルだとリアルタイムで返すのが難しいので非同期処理が使いたくなりますが、ちょうど今年よくさわっていたFastAPIが非同期処理と相性が良いので実装例をつけています。 本格的なサービスを自分自身で構築したことはないですが、デモアプリ程度の規模でも単純な構成だとまともにレスポンスを返せないこともあったので、情報の整理のためにまとめた内容です。

MLopsが注目されていることもあって、MLを使ったAPIサーバーの構成に関する情報は結構手に入りやすくなってきていると思います。どんどんキャッチアップしていきたい分野です。

  • 2020/07/29

github.com

FastAPIとクラウド認証サービス (AWS Cognito、Auth0、Frebase Auth) をシンプルに連携するためのライブラリです。FastAPIはミニマムなAPIをたてるのが得意 (とはいえ、大規模サービスも構築できるらしい) です。認証は頻出の機能としてあげられると思いますが、ミニマムなAPIをたてる際 (例えば推論APIなど)、まともに作ろうとすると認証機能の方が実装が重くなってしまう可能性があります。そこでクラウド認証サービスとの連携が解決策のひとつとして考えられます。

やりたいことは各認証サービスから発行されたJWTの検証だけです。ですが、サービスごとに微妙に仕様が異なります。また、テストも面倒です。そのような面倒事を引き受けるのがこのライブラリの目的です。

自分が公開しているライブラリの中では最も反響がありました (少しですが)。イシューやプルリクに対応するのは初でしたが、些細なことでも公開している側は助かるなという印象を受けました。

また、反応を頂いた方々のプロフィールを見ると、MLをやっている方が多かったです。自分と同じようにFastAPIが機械学習系のAPIと相性が良いとふんでいるかもしれない方がいると知って何故か一方的に親近感がわきました。

  • 2020/08/13

github.com

TensorFlow (keras) で構築したモデルのFLOPS (浮動小数点演算回数) を算出するライブラリです。算出ロジックはTensorFlow自体に実装されているものです。インターフェースを整えたのと、サポートされているレイヤーを少し足してライブラリにしています。 fastapi-cloudauth に比べるとスターやイシューへの投稿などは少ないですが、アクセス数は大差ないです。規模が小さいので大したことは分かりませんが、web系のライブラリと機械学習系のライブラリではユーザーの傾向が結構異なっているのかもしれません。

  • 2020/09/18

github.com

TensorBoard上のインタラクティブなハイパーパラメータ探索結果確認プラグインである Hparamskeras-tuner の探索ログを流し込むライブラリを公開していました。 keras-tuner の開発者の方にプルリクしてみないか誘って頂いたにも関わらず横着していたら、他の方がプルリクをだしていたので、こちらのライブラリは開発を停止してアーカイブしております(笑)。

  • 2020/11/16

github.com

markdownに外部ファイルに書かれているコードを埋め込むためのGitHub Actionを公開しました。 いくつかライブラリを公開する中でREADMEのコードサンプルの動作確認が面倒だったので作りました。このアクションを用いて、外部ファイルにコードサンプルを実装、pytest でテスト、READMEに埋め込み、という流れのCIを構築することが簡潔にできます。

  • 2020/11/25

github.com

MLマネージメントツール (MLflowなど) を試すためのサンドボックス環境です。機能比較している記事をいくつか読んではいますが、利便性があまり実感できていないので、実際に試すつもりです。

Tensorflow (keras-tuner使用) の使用のみ想定しています。mlflowで、探索するハイパーパラメータがトレースできていることを確認しています。現実的な運用方法の検討やマネージメントツールの追加をこれからやっていく予定です。

  • 2020/11/26 (翻訳開始: 2020/06/26 ~ )

qiita.com

FastAPIのドキュメント翻訳を行っています。2020年に最も多くの時間を費やしたのは間違いなくこの活動だと思います。

公式ドキュメントで集計されているTop ContributorsとTop Reviewersに入っていました (2020/12/28現在)。あくまでも翻訳と他のコントリビューターの方々の翻訳の確認だけしかしていないので、何か自分の糧になっているかというとそんなことはないですが、FastAPIの日本語版のドキュメントのリンクが張られているのを見かけると、とりあえずいいねしとくかという気分になるようになりました。

  • 2020/12/15

github.com

Jupyter notebookのグローバル汚染を減らすためのマジックコマンドを公開しました。Twitterで盛り上がっているのを見て作り始めましたが、実装に時間がかかって完全に冷え切った時期に公開することになりました。

やっていることは至極単純で、セルの実行前にグローバルスコープの変数宣言箇所を除去したコードにlint (Pyflake) をかけています。変数のundefinedが検知されたらセル内の処理を実行しない様にしています。このマジックコマンドのメリットは、関数定義時にグローバルスコープの検知ができる・逐一デコレータ等つける必要がない・flake8と同様な記法 (# noqa) で例外指定できる等です。

  • 2020/12/21

github.com

A/B テストを行うときにGolang製のリバースプロキシ側で制御できるという話をどこかで見たので、それを真似しようとしています。以前nginxでリバースプロキシをたてたときに比べると、自分で細かく実装しなければいけないので難しいですが、柔軟な処理がし易いです。 Golangにはじめてふれたのでコードはめちゃくちゃだと思いますが、今後更新していきます。

アウトプットまとめ

振り返るとOSSっぽいことをしたがっていた年ですね。

分野的にはWeb系がほとんどです。転職先では以前とかわらず機械学習エンジニア的なポジションですがWebは全くやっていません。業務スキルの向上など関係なく気楽にやっていた感じですね。

初歩の初歩レベルですが、MLopsへの関心も高かったです。

インプット

論文

CVPR 2020 網羅的サーベイに参加しました。分野は、量子化・枝刈り・蒸留などでした。

読書

機械学習

www.maruzen-publishing.co.jp

機械学習モデルを如何にテストするか、最新の研究動向をふまえてまとめられています。実際にどう実装するかまで述べられている書籍ではないので、pythonでやってみた系の記事を準備しています。

エンジニアリング

gihyo.jp

ソフトウェア開発の基礎的な開発プロセス(WEB寄り)がまとまっているので、情報系でなく、研修も受けたことない足回りガバガバな自分には非常にためになりました。

技術的なこと

  • プログラミング全般:
    • C/C++: 書き始めました。一番初めに学習した言語がC++だったので雰囲気で乗り切れる部分が多少ありますが、1から学びなおしています。Pythonにバインドして使うことがほとんどでした。
    • Pytorch: 業務で必須なので使い始めました。Tensorflowと適宜使い分けられるようにしていきたいです。
    • アノテーション: Pythonの型アノテーションをつけるようになりました。一時期Julialangを書いていたこともあって割とすんなり書けるようになりました。このおかげでC/C++を書き始めても型でつまずくことは少なかったです。
  • web (server side):
    • FastAPIの使用: responderから完全に移行しました。
  • infra:
    • CI/CD: GitHub Actionsを使い始めました。テストやPyPiの更新やデプロイをすべてGitHub Actionsに依存するようになりました。
  • 組み込み:
    • Rassberry Pi: 購入しました。OSインストール後、一度も起動していません。

旅行

コロナ禍なので (ほぼ) どこにも行っていません。

まとめ

年末現在 (2020年12月) で3年目の機械学習エンジニア (歴は満2年半いかないぐらい) です。2020年はソフトウェアエンジニアリングの強化と、エッジデバイスの基礎のキャッチアップに努めた年だった感じがしています。

昨年のまとめを書いた時点と比べると、機械学習に関する成長はほぼないと言っても過言ではないです。もしくは、転職して分野が多少かわったので知識不足の箇所が多く、成長を感じにくいのかもしれません。

昨年のまとめで書いた来年の目標が、今の自分にもあっているので引き続き2021年も以下を心がけようと思います。

来年はアウトプットの質を上げて、範囲を広げるのが目標です。機械学習は会社に入ってから勉強し始めたので経験が浅いため、間違いを指摘してもらったり、学びが多い環境にどんどん自分から飛び込んで研鑽を積んでいきたいです!