AutoML-Zero のビルドとインストール(google-research のソースコードを使用)(Ubuntu 上)

AutoML-Zero は,基本的な数学演算のみを組み合わせた小さなプログラムを進化的探索によって改良し,機械学習アルゴリズムを自動的に発見するソフトウェアである. ソースコードは C++ で書かれており,ビルドには Bazel を用いる. 公式の要件は Bazel 2.2.0 以上,g++ 9 以上である.

前準備

Ubuntu のシステム更新

Ubuntu で OS のシステム更新を行うときは, 次のコマンドを実行.

# パッケージリストの情報を更新
sudo apt update
# インストール済みのパッケージを包括的に更新 (依存関係も考慮)
sudo apt full-upgrade
# 変更をシステム全体に確実に反映させるために再起動
sudo shutdown -r now

Git のインストール

次のコマンドを実行.

# パッケージリストの情報を更新
sudo apt update
sudo apt -y install git

C/C++ コンパイラと Make とビルドツールのインストール

次のコマンドを実行. build-essential により gcc, g++, make がインストールされる. zip, unzip は Bazel が実行時に使用する.

# パッケージリストの情報を更新
sudo apt update
sudo apt -y install build-essential gcc g++ make pkg-config zip unzip curl

Bazelisk による Bazel のインストール

AutoML-Zero のソースコードには .bazelversion ファイルが含まれ,ビルドに使用する Bazel のバージョンが指定されている. Bazelisk は,このファイルの記述に従って必要なバージョンの Bazel を自動的にダウンロードして実行するツールである. そのため,Bazel 本体を直接インストールする場合と異なり,バージョンの不一致によるビルドエラーを避けることができる.

インストールするには,次のコマンドを実行. bazelisk を /usr/local/bin/bazel という名前で配置することにより,bazel コマンドとして使用できる.

sudo curl -fsSL -o /usr/local/bin/bazel https://github.com/bazelbuild/bazelisk/releases/latest/download/bazelisk-linux-amd64
sudo chmod +x /usr/local/bin/bazel
bazel --version

Arm 系の CPU を使用している場合は,ファイル名を bazelisk-linux-arm64 に変えて実行.


AutoML-Zero(google-research)のビルドと実行

  • google-research のソースコードのダウンロード

    google-research のリポジトリは多数のプロジェクトを含み容量が大きいため, --depth 1 を付けて最新のコミットのみを取得する.

    cd /usr/local/
    sudo rm -rf google-research
    sudo git clone --depth 1 https://github.com/google-research/google-research.git
    sudo chown -R ${USER} google-research
    
  • AutoML-Zero のビルドと実行

    次のコマンドを実行. run_demo.sh の中で bazel run が実行されるため,このときソースコードのビルドが行われる. 初回はコンパイルと依存ライブラリ(Eigen, protobuf, Abseil など)のダウンロードのため時間がかかる.

    cd /usr/local/google-research/automl_zero
    ./run_demo.sh
    

    このデモは,線形回帰のタスクを解くプログラムを進化的探索によって発見するものである. 10 個の線形回帰タスクで探索を行い,発見されたプログラムを 100 個の別のタスクで評価する. 適合度(1 - RMS 誤差)が 0.9999 を超えたプログラムは,さらに 100 個の未知のタスクで最終評価される. 最後に,最終評価の結果と,発見されたアルゴリズムのコードが表示される. 公式の説明では,CPU 1 個で 5 分程度で終了する(乱数の種やハードウェアにより変動する).

    デモでは,線形回帰の実装に必要な数学演算だけを許し,プログラムの長さも固定して探索空間を小さくしている.


    Python による AutoML の簡易例

    AutoML の考え方(モデルやハイパーパラメータの探索を自動化する)を確認するため, scikit-learn を用いてハイパーパラメータの探索を行う Python プログラムを示す.

    scikit-learn をインストールするには,次のコマンドを実行.

    # パッケージリストの情報を更新
    sudo apt update
    sudo apt -y install python3 python3-numpy python3-sklearn
    

    次の Python プログラムを実行.

    from sklearn.datasets import load_iris
    from sklearn.model_selection import train_test_split
    from sklearn.ensemble import RandomForestClassifier
    from sklearn.metrics import accuracy_score
    
    X, y = load_iris(return_X_y=True)
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
    
    n_estimators_candidates = [10, 50, 100, 200]
    max_depth_candidates = [None, 2, 4, 6]
    
    best_score = 0.0
    best_params = None
    
    for n_estimators in n_estimators_candidates:
        for max_depth in max_depth_candidates:
            model = RandomForestClassifier(n_estimators=n_estimators, max_depth=max_depth, random_state=0)
            model.fit(X_train, y_train)
            y_pred = model.predict(X_test)
            score = accuracy_score(y_test, y_pred)
            if score > best_score:
                best_score = score
                best_params = (n_estimators, max_depth)
    
    print("Best params (n_estimators, max_depth):", best_params)
    print("Best accuracy:", best_score)
    

    このプログラムは,決定木の本数(n_estimators)と木の最大深さ(max_depth)の組み合わせを総当たりで試し, 正解率が最も高い組み合わせを選ぶ.これはグリッドサーチによるハイパーパラメータ最適化である.

    AutoML-Zero は,このようなハイパーパラメータの調整とは異なり,学習アルゴリズムそのもの(予測の計算方法と重みの更新方法)を探索の対象とする.