魚類の中でもマンボウはとても多くの数の卵を生むことで知られており、それが産卵数とイコールなのかは諸説あるものの3億個もの卵を抱えていると言われているのだそうです。Chainerで学習してるとその進捗をSlackで見られるようにしたいですよね。そこで、ChainerのPrintReport(標準出力への学習ログレポートExtension)を拡張して同じ内容をSlackに送るExtensionをさくっと作りました。belltailjp/chainer_slack_reportChainerの学習ログをSlackに流そう!という発想自体は当然いくらでもあって、ネットで軽く探しただけでとても優れた先例がたくさんありますし、野良で作って自分で使っている人も少なくないと思います。Chainerぼく個人が自分のユースケースにおいて一番困っていた点、そしてchainer-slack-reportで解決しかった点は、いろんな学習を並行して回してその全てをSlackに流しても表示や時系列が崩れないようにしたかったことです。上のスクリーンショットを見ていただくとSlackReportが複数の学習のレポートをうまくさばいている様子がわかるかと思います。技術的には全く高度なことはしていなくて、「(SlackReportオブジェクトのライフタイムにおいて)初回はSlackに新規メッセージを投げる」「2回め以降はそのメッセージを編集する」というふうにしているだけです。他に実装上の違いとして、ChainerのPrintReportをそのまま継承して画面表示部分のみを乗っ取る実装にしたため、テキストの整形やシリアライズの仕組みはまるごとPrintReportがやってくれるという超シンプルな作りになっています。何もしないでもserialize・deserializeに対応している点も地味に助かります。PrintReportではtrainerのsnapshotをロードして学習を途中から再開したとき過去の学習記録をまるごと再表示してくれますが、SlackReportもそのまま同じように動いてくれます。chainer-slack-report学習コードで使うには、PrintReportと同じようにtrainerに差し込むだけでOKです。PrintReportと共存できますし、複数のチャンネルに同時に投げたい場合はchannel_idを変えて別々のSlackReportを作りそれぞれをtrainerにextendすればOKです。PrintReportの初期化時に渡せるような引数はすべてSlackReportの初期化時にも渡せます。それに加えてSlackに投稿するために必要な情報を渡す必要があり、またSlackでの通知内容の細かな制御のためのオプションを渡すこともできます。APIを叩くためのアクセストークンおよび送信先となるChannelをさすIDがあります。これらの情報の取得・確認方法はGithubでスクリーンショット付きで解説しています。どちらかがNoneの場合は単純に何もしないようになっています。そのため環境変数から取ってくるなどのイディオムを採用するのがよいでしょう。複数の学習が破綻なくSlackに表示されるのはいいけど、どれがどれかわからないと(数が多いときは)意味がありませんね。SlackReportではデフォルトでスクリプト名とその引数(要するにargv)をレポートの頭に表示します。Jupyterで学習を回している場合はこれでは実質無意味な情報になるので、マニュアルで指定することもできます。その場合はSlackReportの初期化時にlabelという名前付き引数に任意の文字列を指定すればOKです。SlackReportのイニシャライザのfinish_mentionsという引数にユーザのアカウント名(@何々)を文字列ないし文字列のリストで渡すと、学習が終了したときにmentionを飛ばしてくれる機能もあります。学習の終了に気づきやすくなるので便利でしょう。何も指定しないと(あるいは指定されたユーザが存在しないと)、普通のレポートのみが表示されて終了します。Slackのメッセージ長さ制限(2000文字)に引っかからない限り何人でも大丈夫です。ユーザグループは未対応です。APIを叩くために必要な権限が変わりました。settingしてもOKです。users:readの権限が必要ですTrainerを使っていないコードでも使えますか?__call__関数で表示までしているのですがこれがtrainerを受け取っているという形で依存しているので、基本的にはTrainerを使っていただけたらと思います。断念した機能ChainerにはPlotReportという学習曲線を随時グラフ(PNG画像)にして保存するExtensionがあります。これもSlackReportで乗っ取ってSlackに投げるようにしてみよう!と思ったのですが、SlackのAPIには「画像を上書きアップロードする」という機能がないため、強引に実現しても「時系列が狂わない」という基本コンセプトが守れないので、断念しました。いい見せ方ができるアイデアが何かあればよいのですが。2019年4月8日DashのalternativeとしてLinuxマシンではZealを使っています。Dashにはキーボードショートカット機能があり、指定したキーマップでDashのウィンドウのアクティブ・非アクティブをトグルすることができてとても便利です。Zealには標準機能としてはこれがなくて、手で毎回画面を出し入れする面倒くささに真面目に対処してこなかったんですが、ちょっとUbuntuのキーボードショートカット機能とxdotoolによるウィンドウ操作を駆使して(というほどのことはしてない)一発でトグルできるようにするシェルスクリプトを書いたので自分用メモも兼ねて記録。ウィンドウを操作するためにxdotoolが入っている必要があるのでaptで事前に入れておいてください。Add”で、このシェルスクリプトへのパスを追加するだけです(+xパーミッションをつけるかshを頭につけるかしないとエラーになります)。scriptで)activateする直前までactiveであったウィンドウを再びactiveにするのみで、Zealのウィンドウ自体はその元ウィンドウの後ろに行くだけで最小化されたり見えなくなったりはしません。Zealがactivateされたとき直前まで使っていたウィンドウを隠していない場合、deactivateされたZealは見えたままフォーカスだけが元のウィンドウに戻ります(元ウィンドウをZealが隠していた場合、元ウィンドウが最前面に出てくることに伴ってZealは隠されることになります)。この挙動はデュアルスクリーンの左右でコーディングとZealを行き来するときに便利であると思います。scriptはだいぶ軽くできます)。3.20160805.1で動作を確認しています。2019年1月28日イワシの大群が特に大規模になったとき、それをサーディンランと呼び、個体数は数千万とも数億とも数十億ともいわれるのだそうです。そのような生物量がそれほど密集したとき酸素濃度は足りるんだろうかと心配です。データ処理の一環で億オーダーのレコード数(ディスク上で~100GB)をもつSQLiteテーブルを構築しようということになり、データ自体は生CSVがある状態でこれをなるべく短時間でDBに流し込むという雑なチャレンジをしてみたので、雑な記録をまとめておきました。できるだけPythonで閉じさせたかったため、C++などで書くという選択肢はなし。DBサイズがサイズなのでインメモリではなくファイルに吐き出します。Peeweeを使用することにしています。Peeweeについて詳細は触れないですが、(ユーザビリティ的な意味で)とても軽量でありまたPythonicであるので個人的にはとても好きです。selectのwhereの比較演算子を文字列で渡すとかしなくていいのです。DB関連は全くの素人なので、もっといい方法があったらぜひアドバイスをいただきたいです。完全なコードをGist上のipynbにまとめています。2019年1月20日あけましておめでとうございます。手元のデスクトップPCのベンチマークをUnixBenchでとってみたのでメモ。USBなのは、処分前でディスクをすでに抜いてしまっため。Copy関連は参考にならない(低く出ているはず)です。governerをperformanceにしています。CPU搭載のUbuntuであればperformanceとpowersaveモードが利用可能ですが、powersaveにしてもスコアは誤差レベルでしか変わりませんでした。7787.0アイドル時は800MHzまでクロックが落ちるのでいいですね。CPUファンをちょっと良いやつにしてみたので、CPU温度もアイドル時30度・UnixBench時や動画並列エンコードなど最大負荷をかけても50度にはいかない程度にとどまるので、とても安心感あります。空冷でもちゃんとしたやつならハイエンドCPUに対しても十分みたいですね。この構成で1070Tiを載せてパーツ代全部で税込み17万円ぐらい。BTOだったら20万を下回ることはない構成(2018年12月現在)なので自作だとやはり結構抑えられますね。PC組むの久々なのでまる1日仕事にはなりましたが。MWIPS)が実はコア当たりだと全然速くなってないらしいのが意外。SIMDでなければ1FLOP/1clockに漸近していくからかな?OS関連、プロセスとかシステムコールとかが圧倒的に速くなってるみたい。日頃の動作で差を感じることは多そう。海洋の生物量の推定をするときには、実際にある空間の種ごとの個体数を1匹1匹数えるわけにはいきません。そこで、水中に残った生物の細胞のDNAすなわち環境DNAの密度を手がかりにして推計をするのだそうです(バケツ一杯の水で海洋生物の量や種類を知る)。passの理論的な計算量・メモリ転送量を計算するchainer_computational_costを作りました。Hookをベースにしているため、NNの定義コードに手を入れる必要は一切ありません。2018年6月7日OpenCVをPythonサポート込みでビルドしたいことがあります。Python側へインタフェースを露出するためのヘッダなどが必要なので、いくつかのPython関連パッケージを入れれば、あとはシンプルにCMakeを実行すればよいことがほとんどです。..一方で、rootがないなどの状況でpython2.7-devなどのパッケージがシステムにない場合は、例えばpyenvを使って一時的にpythonをユーザ環境に入れそのパスを参照させることで、Python対応こみでビルドすることが可能です。2.8.12.22.8系では、うまくPythonのライブラリをみつけてくることができないようです。OpenCVの提供するCMakeLists.txtのcmake_minimum_requiredは(Linuxであれば)2.8になっているので、特に怒られることなく進んでしまう、というのが罠でした(今回取り上げたかなり限定的なシチュエーション以外ではそれで問題なく動くためです)。3.5などを使ってください。Ubuntu14.04をまだ使っていたりした場合は、標準でapt-getしたものは2.8までになります。野良ビルドするなり、PPAにするなり、新しいUbuntuに乗り換えるなりするといいです。魚を飼う時、繁殖をさせやすいのはグッピーやアカヒレなどだそうです。数匹のつがいがいればすぐに数百匹まで増えてしまうんだとか。tmuxヘビーユーザーなんですがセッションが乱立しがちで、外からsshして既存セッションをattachするときにどれがどれかわからないことが個人的にはよくあります。rename-sessionをすることでセッション全体に名前をつけることができ、attachするときこの名前で参照することができて便利です。これを、セッション作成時に自動で聞くようにしてみました。やりたいことtmuxでセッションを作ったあと最初のウィンドウが開かれる時、そのセッションに名前をつけるのを強制したい何も入力しないことも許容する。rename-sessionコマンドを呼ぶだけです。何も入力しない場合はセッション名はデフォルトのまま放置しますが、そのままだとセッション内で新たなshellを開く度にプロンプトが出て鬱陶しいので、それが出ないようtmuxのsession-wideな環境変数を使いマークしています。シェル環境変数にマークした場合引き継がれないのでうまくいきません。2.2(Mac)と2.1(Ubuntu)で確認しています。てきとうに書いたのでもっとCOOLなやり方もあると思いますが、ひとまずこんなかんじで。2017年12月3日マッコウクジラは鯨の中でも特に深海に特化した進化をしていて、海面で息継ぎをしてから3000メートルを一気に潜ってしまうそうです。頭部にびっしり詰まっている脳油を海水と血液で冷やしたりし温めたりて比重を変えることで潜ったり浮いたりする様は、潜水艦よりも高度とさえ言えるのかもしれない。Tabを使っていても画面上の方にタブバーが一緒に出てきてしまって邪魔でした。Userを適用すると動きました。合わせると、新規作成するuserChrome.cssには次のような内容を書けばOKです。collapse;}Macだとちょっとだけウィンドウのタイトルバー?がおかしいですが、困るものではないのでまぁいいでしょう。2017年10月23日8000メートルなどを超えるような超深海では、超高圧のためタンパク質の構造自体が保てなくなる(水分子が侵入し破壊される)ことから、通常の構造の延長としての生物は生息できないのだそうです。そこにいる生物は、TMAOという物質がもつタンパク質に侵入する水分子をブロックする性質を利用して生きているのだとか。Pythonを使って2次元のガウス窓を生成したくなりました。1次元でのscipy.signal.gaussianの多次元版にあたるものです。具体的には、画像として描画するとこんなかんじになるような配列の生成が目的です。Fishesとかは結構分量も凄くて、英語中心ですがときどき役に立ちます。Macを3年ぐらい使ってきてて恥ずかしながらわりと最近までドキュメントのインクリメンタルサーチができるDashを知らなかったんですけども、ちょっと前から使うようになりました。仕事や趣味でChainerを使うんですが、ChainerのドキュメントはDashで提供されてないので、自分でドキュメントをDash用に変換する必要があります。言えChainerはSphinxでドキュメントが書かれているので、doc2dashというpipを使えば一発でできます。すごい簡単なんですが、環境を新しくする度にやり方を調べてやってる気がするので、メモ。specificな話題にしてみました。doc2dashを入れる。アイコンに使う画像をダウンロードしてくる。ここではTwitterから。#アイコンが不要な場合これを実行すると、chainer2.docsetというディレクトリが生成されます。Sphinx等はもちろん入っている必要があるので、怒られた場合は指示に従って入れてください。Dashをインストール済みのMacでFinderにてこのディレクトリをダブルクリックすると、検索できるドキュメントとして追加されます。html)がこんなかんじで失敗することがあったので、Linux環境でmakeしました。htmlすると通ることも度々ありました。1また、DashのWindows/Linux版であるZealを使っている場合、上記の手順でビルドしてできたchainer2.docsetディレクトリを、Zealのdocsetsディレクトリに入れることでZealに見えるようになります。~/.local/share/Zeal/Zeal/docsets/(docsetsディレクトリの場所は環境によって異なる可能性があります。✌’ω’)✌たのしい!なお、後になってDash-User-ContributionにChainerがあることを知った...https://github.com/Kapeli/Dash-User-Contributions/tree/master/docsets/Chainer常に自分の責任で最新に追従させたいわけじゃなければ、これで十分。Meおさかなさんと呼んでください。コンピュータビジョン・パターン認識・機械学習でお仕事をしています。強くなれなかった元・競プロ勢。