Month: October 2023

【pybind11】Pythonが重すぎるのでC++に手伝ってもらう

こんにちは。RockinWoolです。今日はpybind11を使ってpythonの一部処理をC++に置換して高速化することを目指します。私はかねてからPythonの処理があまりにも遅すぎることに悩んでました。このせいで、実験がうまくいかなかったり、プログラムの完了までに1ヶ月近い時間がかかったりしていました。ChatGPTにこのことを相談したらpybindが初心者向けで良いとの回答をもらったので、今回はこの悩みを解消すべく環境構築していきます。 pybind11の導入 今回はanaconda環境に導入する方法を示します。pipで管理している人はcondaコマンドやLinuxのPATH情報を適宜入れ替えて貰えれば問題無いと思います。まずはpybind11をcondaでインストールします。 ビルドの設定 次にCMakeLists.txtの準備をします。余談ですが、今回作成するプログラムはnetworkxで作成した複雑ネットワークを取り扱うことを考えています。ですので、C++のファイル名はload_network.cppとしてtoolsetライブラリ内に配置するとしました。つまり、CMakeLists.txtから見て下記のような配置になっています。 CMakeLists.txt|-build |- load_network(ビルド後生成物。pythonで呼べる)|-toolset |-load_network.cpp この状態におけるCMakeLists.txtはこんな感じになります。condaのbase環境にpybind11を入れているので、特定の環境に入れている場合はenvs//includeのように置き換えてください。 cmake_minimum_required(VERSION 3.2)project(pybind_test VERSION 0.1.0)find_package(pybind11 REQUIRED)find_package(Python REQUIRED)include_directories(/home//anaconda3/include)include_directories(/home//anaconda3/include/pybind11)link_directories(/home//anaconda3/lib)pybind11_add_module(load_network ./toolset/load_network.cpp) C++プログラムの本体 そしてload_network.cppの本体を下記のようにします。 1行目はpybind11を使うために必要な呪文、2行目はpythonのリスト型を扱うために必要な呪文という感じです。プログラム的には引数をそのままリターンする関数なので特別な処理はしていません。PYBIND11_MODULE(load_network, m)以降は完全に元記事を参考にしただけなので意味は良くわかっていませんが、ビルド後に関数呼び出しをする際に必要になる設定だと思っています。上記のload_network.cppをCMakeLists.txtを使ってビルドすればload_network~~.soができるので、これをtest.pyと同じ階層においてtest.pyから呼び出せば機能します。なので次はtest.pyを作りましょう。 呼び出し元のPythonプログラム あまり言及することはありませんが、c++で作ったライブラリが存在していると仮定してそのまま実装すれば機能します。す、すごい! まとめ pybind11はcondaコマンド一発でインストールできるので、かなり使いやすいと感じました。また、cmakeに馴染んでいることが条件になってきそうなので、c++と併せて勉強しなければと感じました。これを使って自作ライブラリとか作れればかっこいいなとか思いつつ、次回に向けて精進します。ここまで読んでくださってありがとうございました。

つぶやき: 最近感じたこと&Stable-diffusion

こんにちは。RockinWoolです。今日はUbuntuにStable-Diffusionを入れて遊んでみたので、その日記を残したいと思います。とは言っても、インストール方法やセットアップに関してはこちらに非常に細かく書いてあります。ですので、今回は最近の人生で感じていることなどを書き散らしていこうと思います。 何故いまさらStable-diffusion? つい先日、Deep Neural NetworkのモデルをPythonで作って回す機会がありました。しかし、私のPythonの書き方が悪いのか非常に重い処理となり、PCを4台並行にぶん回してようやく一通りの結果を算出できるという有様。そして、計算後にはPCが余ってしまいました。しかし、これらは私がAIを回すために作ったものであり、放置して劣化させるのは非常に勿体ない!そこで、なにかに活用できないかと考えていきついたのがStable-diffusionでした。 それはそれとして、このPCの活用方法と考えたときに色々やりたいことが出てきて、自分の中の欲望をちゃんと整理して生きていかなければと思いました。例えば、pythonの処理が重いのでc++でパッケージを作ってpythonから呼べるようにしたい!とか、英語を喋れるようにしたいのでチャットボットを作りたい!とか、昔作った3Dモデルを改良してチャットボットと融合させて完全AIのVtuberを作りたいとか、Atcoderやるためにc++練習しなきゃとか。あとはお金さえあればJetsonを買って自動運転の実装をするとか。自分はやりたいことが無限に出てくるタイプなので、普段からこまめに消化しなきゃと改めて感じました。それだけに、仕事の関係で頭痛持ちになったのが悔しい。動ける日の最大火力が減ってしまって、すごく不便です。(そういえば、休職した元職場に居た同僚がまた一人転職で職場を離れることになったので、まずは前進できてよかったと思うなど) Stable-Diffusionインストール 検索して最初にヒットするStable-diffusion-webuiはインストール後にpytorchがエラーを起こしてうまく動作しなかったので、Easy-diffusionと呼ばれる別のアプリを用いてStable-diffusionを試しました。そうすると、Easyとついているだけあって簡単にインストールすることができました。 結果サンプル 1個10分もかかって草。ちゃんとしたGPUの環境でやるほうが吉ですね。 まとめ 思い立ったときに一気に進めるのも良いけれど、自分の人生を計画的に進めることも大切ですね。それはそれとしてStable-diffusionは面白かったです。