私が作ったライブラリの宣伝です! C++でwandbを叩くためのライブラリです!
GithubでStar⭐⭐やIssueで様々なご指摘,新規機能のリクエストなどをいただけると嬉しいです!! PRなどをしていただけると更に嬉しいです!!
どんなことに使えるの?
C++で数値実験などをする方々は,その結果をどのようにプロット・管理していますか?プロットするだけであればMatplot++やmatplotlib-cppなどを使っているのではないでしょうか?また,結果の保存はローカルファイルにしているはずです.
このライブラリは,C++での数値実験の結果をクラウドにアップロードしてweb上でビジュアライズするための便利ライブラリです.
Weight & Biases
Pythonには機械学習の研究者用のWeight & Biases (wandb)というメチャメチャ便利なフレームワークがあります.
このサービスを使うと,機械学習中の損失の履歴やその出力などを簡単にクラウドにアップロード・可視化出来ます.しかも,個人利用であれば,100GBまで無料で使えます.すごい!
詳しくは,以下の記事が参考になります.
WandB-CPP
このwandbというフレームワーク,基本的にPythonでの利用のみサポートいます.現在,公式にC++での利用はサポートされていません.そこで,PythonプログラムをC++から呼び出せるようにしたのがこのライブラリです!
実装にはPython/C APIを生で使っています.基本的な使い方は,以下のような感じです.
#include <cmath>
#include "wandbcpp.hpp"
int main() {
wandbcpp::init({.project = "example_wandb_cpp", .tags = {"basic"}}); // この実験結果をexample_wandb_cppプロジェクトに保存・basicタグをつける
int N = 100;
wandbcpp::update_config({{"N", N}, {"mode", "abc"}}); // この実験のパラメータをconfigに保存
for (int i = 0; i < N; i++) {
double t = M_PI * i / N; // 数値実験のデータ: t
double x = std::sin(M_PI * i / N); // 数値実験のデータ: x
double y = std::cos(M_PI * i / N); // 数値実験のデータ: y
wandbcpp::log({{"t", t}, {"x", x}, {"y", y}}); // 時刻t,数値x・yをログに記録
}
wandbcpp::update_summary({{"success", true}}); // summaryを保存
wandbcpp::finish();
}
まず,wandbcpp::init
でプロジェクトを指定します.
次に,wandbcpp::update_config
でこの実験の設定(パラメータ)を保存し,
for文の中で実験を実行・ログを保存します.
最後にwandbcpp::update_summary
でこの実験のsummaryを保存します.
update_config
,log
,update_summary
の引数の{{"...", ...}, ...}
はpythonのdictのように使えます.テンプレートを使って,適当な型のデータを入れても良しなに処理するようにしています.
実行すると,コンソールに以下のような表示がなされます.
出力
表示されるリンクに行くと,以下のようになります.
ログ出力などの実行コスト
このライブラリは実行時間にシビアなロボット制御などでも使えるように,ログを保存するwandbcpp::log
関数などには時間がかからないように設計しています.実際に計測したところwandbcpp::log
の実行にかかる時間は3usでした.
これは,ログの保存など,Pythonインタプリタを呼び出して行う処理は全て別のスレッドで行っているためです.
なので,ロボットの制御ループのプログラムに,ログを保存するコードを入れても基本的に大丈夫です!ただし,wandb自体,大量のログを一度にアップロードする使い方が想定されていないため,アップロードするログの量が多くなりすぎないような工夫(100msに1回のみログを保存するようにするなど)を入れてください.
その他の機能
例えば,OpenCVと連携して画像を保存する機能や
動画を保存する機能など
をサポートしています!
他にも色々あるのですが,詳しくはリポジトリのREADMEを参照してください.
今後は公式でサポートされるかも...
Githubのwandbの公式に以下のようなリポジトリが作成されていたのですが,どうやらREADME.mdを作成したあと力尽きています.
公式でサポートされると,おそらくwandbのAPIを直接用いたものになるはずなので,私のものより良くなるはずです.今後の開発に期待したいですね.