概要
機械学習はパイプライン、コード、データのそれぞれ多様で開発中は頻繁に変更するため、コードだけでなくデータのバージョン管理や機械学習の処理のパイプラインを管理する必要があります。
コードの管理はGitHubを使うとしてデータの管理、前処理をしたデータの管理はこれから発展していくと思っています。
今回Nix、Cachix、GitHub Actionsを使った余計なオペレーションのないコードとデータのバージョン管理かつ機械学習の処理のワークフローを紹介します。
実現したいことは次の通りです。
- パイプラインをコードで管理する。
- これはGitHubで管理できますね。
- だれがどの環境で行っても結果が再現される。
- これを行うにはデータも使うソフトのバージョン管理が必要です。
- 結果をキャッシュし無駄な計算をしない。前処理など一度誰かが行った操作はキャッシュしたものを使う。
- 数GBのデータの管理はGitHubには載せにくいです。S3を使うのが良さそうですがバージョン管理が別途必要です。
Nixとは
Nixはパッケージ管理ソフトです。汎用的なものでgcc、emacs、pythonなどなんでも管理できます。
入力のファイルやパッケージをハッシュ値付きで指定し、生成物を作り、それに対してハッシュ値を計算してストレージに保存します。 つまり、純粋な関数型言語のように入力が決まれば出力が決まる構成になっています。
ストレージにはローカルのディスクやS3などが指定できます。
すでに生成物のハッシュ値に対応するものがあればそれをダウンロードします。無駄に計算は行いません。
Dockerに似ていると思われるかもしれませんが、Dockerはファイルのハッシュ値も要求しませんし、生成物をつくる過程でネットワークに接続するかもしれません。しかし、Nixでは生成物をつくる過程でネットワークからのダウンロードは許しません。
Nixはマルチプラットフォームで、LinuxとMacosをサポートしています。NixはUbuntuやRedhat上にインストールできます。
NixOSというものもありますが、Nixしかパッケージ管理ソフトがないOSです。
パッケージの記述にはNix Expressionを使います。ML風の動的型付けの関数型言語となっています。
関数型といってもHaskellとは関係ありません。
Cachixとは
CachixはNixの成果物を管理するサービスです。Nixの成果物はストレージやS3に置くことができますが、GitHubのような個人的なポータルとしてCachixがあり、個人的なNixの生成物をCachixに保存できます。
GitHub Actionsとは
GitHub ActionsはJenkinsのようにCIを行うサービスでGitHubが提供しています。
CIでよく行う作業がマーケットプレイスで共有されています。
Cachixもマーケットプレイスでサービスを提供していています。
こちらです。
たとえば、GitHubのレポジトリに.github/workflows/test.yml
のファイルを置きます。中身を下記のものとします。
するとレポジトリにpushするたびにNixでパッケージ作成が行われ、その成果物が自動的にCachixにキャッシュされます。
古いキャッシュは勝手に消えます。
name: Test
on:
pull_request:
push:
jobs:
tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- uses: cachix/install-nix-action@v6
- uses: cachix/cachix-action@v2
with:
name: mycache
signingKey: '${{ secrets.CACHIX_SIGNING_KEY }}'
# Only needed for private caches
authToken: '${{ secrets.CACHIX_AUTH_TOKEN }}'
Nix、Cachix、GitHub-Actionsを使ったワークフロー
GitHubに下記のこちらにあるような (自分で作ったものではないです。) レポジトリをつくるとデータフローができ、成果物はCachixで置かれ、一度行った計算があればキャッシュを使ってダウンロードして無駄な処理が行われないワークフローが出来上がります。
まとめ
Nix、Cachix、GitHub Actionsの紹介とそれらを連携させてワークフローをつくる紹介をしました。
Nixは入力ファイルと必要なパッケージが厳密に管理されるので、だれがどの環境で行っても結果が再現されます。
加えて生成物が自動でキャッシュされるため無駄な計算をしないでの機械学習の前処理の管理に適していると思い紹介しました。