LoginSignup
12
3

More than 3 years have passed since last update.

Nix、Cachix、GitHub Actionsによるワークフローの紹介

Last updated at Posted at 2019-12-20

概要

機械学習はパイプライン、コード、データのそれぞれ多様で開発中は頻繁に変更するため、コードだけでなくデータのバージョン管理や機械学習の処理のパイプラインを管理する必要があります。

コードの管理は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にキャッシュされます。
古いキャッシュは勝手に消えます。

test.yaml
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は入力ファイルと必要なパッケージが厳密に管理されるので、だれがどの環境で行っても結果が再現されます。
加えて生成物が自動でキャッシュされるため無駄な計算をしないでの機械学習の前処理の管理に適していると思い紹介しました。

12
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
3