LightGBM の Python パッケージを GitHub リポジトリからビルドしたいことがあると思います (デバッグプリントを仕込みたい、改造したいなど)。
GitHub リポジトリからの Python パッケージビルド手順は、ドキュメント [下記1] の Build Python-package からリンクがあり、そのリンク先 [下記2] の Install from GitHub にあります。つまり、OS に応じて必要なソフトをインストールした上で、GitHub リポジトリを取得して sh ./build-python.sh install を実行するだけです。
- Installation Guide — LightGBM 4.6.0.99 documentation#build-python-package
- LightGBM/python-package at master · microsoft/LightGBM
それだけですが、私が Ubuntu 環境で作業したときの手順を、ポイントを含め記します (普段から Ubuntu 上で Python 開発されている場合は特に詰まらない内容かもしれません)。
私の作業環境は以下の Amazon EC2 インスタンスでした。
AMI: Ubuntu Server 24.04 LTS, インスタンスタイプ: m8a.xlarge (x86_64/AMD EPYC)
先にポイント
先にポイントを書くと以下です。
- Ubuntu 環境では Python, pip と
cmakebuild-essentialがあれば LightGBM の GitHub リポジトリから Python パッケージがビルドできます。 - ビルド時には、その場 (リポジトリ直下) で、コマンド
pythonpipがシステム環境の Python, pip (標準的にはusr/bin/*) ではなく自分が入れた Python, pip を呼び出すようにしてください。システム環境の Python, pip が呼び出されると、build-python.sh内でbuildパッケージを入れて実行する時点でおそらく入れられず失敗します (そもそも Ubuntu システム環境の Python にパッケージを入れるのは避けた方がよいです)。- これはエイリアスによる退避では駄目です (スクリプト内でエイリアスは効かないため)。
type -a pythontype -a pipと打って、自分が入れた実行ファイルが (エイリアスではなく) 上位なら大丈夫です。 - 例えば pyenv で Python を入れていて、グローバルまたはビルド場所にローカルにバージョンを設定していれば問題は起きないです。
- もし自分の入れた Python, pip を呼び出すコマンドが
python3pip3だという場合は、build-python.sh内の L183 (build のインストール) と L374 (build によるビルド) と L386 (lightgbm 自体のインストール) を書き換えれば大丈夫です (行数は現在のリビジョン 80ab6d3 におけるものです)。
- これはエイリアスによる退避では駄目です (スクリプト内でエイリアスは効かないため)。
-
lightgbmはnumpyとscipyを要しますが、少なくともリポジトリからのビルド&インストールでは勝手に入りません (実行してみたらすぐわかりますが)。
ビルド&インストール手順
以下のような流れになると思います。
# git 及び C/C++ 系ソフトウェアをビルドツールを取得します (もしなければ)
sudo apt update
sudo apt install -y git cmake build-essential
# LightGBM のソースコードを取得します
git clone --recursive https://github.com/microsoft/LightGBM
cd LightGBM
# ここで type -a python と type -a pip の結果が意図通りか確認します
# もし必要ならば build-python.sh 内を python3 などに編集します
# その上でビルド & Python にインストールします
sh build-python.sh install
# 自分でビルドした LightGBM が入ったことを確認します
python -c 'import lightgbm; print(lightgbm.__version__)'
# -> 4.6.0.99 # PyPI から入れるとたぶん 4.6.0 です
# LightGBM を実際に動かすには最低限これらも必要です (もしなければ)
pip install numpy
pip install scipy
# そうしたら Python から LightGBM が動くことを確認します
# 必要ならば LightGBM のソースコードにデバッグプリントを仕込んだり改造したりします
# そしてまたビルド & Python にインストールします
sh build-python.sh install
(おまけ) デバッグプリント
以下のように「gain がこの値になったというのはどういうことだったんだろう」とかデバッグできます。さらにおまけですが私がこれで学んだことがこちら (はてなブログ) です。
void FindBestThreshold(double sum_gradient, double sum_hessian,
data_size_t num_data,
const FeatureConstraint* constraints,
double parent_output,
SplitInfo* output) {
output->default_left = true;
output->gain = kMinScore;
find_best_threshold_fun_(sum_gradient, sum_hessian + 2 * kEpsilon, num_data,
constraints, parent_output, output);
output->gain *= meta_->penalty;
+ if (output->gain > 56.87) {
+ Log::Info("PARENT_OUTPUT %.6f", parent_output);
+ Log::Info("GRAD %.6f", sum_gradient);
+ Log::Info("HESS %.6f", sum_hessian);
+ Log::Info("GRAD(L) %.6f", output->left_sum_gradient);
+ Log::Info("GRAD(R) %.6f", output->right_sum_gradient);
+ Log::Info("HESS(L) %.6f", output->left_sum_hessian);
+ Log::Info("HESS(R) %.6f", output->right_sum_hessian);
+ Log::Info("GAIN %.6f", output->gain);
+ }
}