オッサンはDesktopが好き

自作PCや機械学習、自転車のことを脈絡無く書きます

Tensorflow v1とTensorflow v2を共存させる

 こんにちは.changです.

 Tensorflow ver. 1.14.0を長く使っていますが,Tensorflow 3D*1を試す為にv2を導入することにしました. 今までに書いたソースは同じ環境で使い続けたいので,v1とv2を共存させます.

 Pythonの開発環境を複数持つ方法はいくつか在ります.

(1) ハードディスクを分ける

 古臭いやり方ですが,ドライバレベルから環境を分ける一番確実な方法です. 僕の場合,システムファイル用とデータファイル用にHDDを分けているので,システムファイル側だけを変えればソースは共有できます. 500GBのSDDも5000円位で買える時代ですし,僕的にはプランAです.

 これをやるつもりでSDDも買ったのですが,「一度は今風の仮想環境を試そう」と思い立ったので見送りにします.

(2) Dockerを使う

 王道のやり方という事は知っているのですが,恥ずかしながらやったことがありません. これもどこかで試すつもりですが,今回はより簡単な(3)を採用します.

(3) vertualenvを使う

 Pythonを複数ver.持つための仮想環境です. 今回はこれを試します.

 Tensorflow ver.1.14.0の対応CUDAは ver. 10.0,今回導入するTensorflow ver. 2.3.0の対応CUDAはver. 10.1です*2. vertualenvの中にCUDAを入れることは出来ません. ですので,複数ver.のCUDAを同一PC内に入れ,かつ干渉させないことが,今回の一つのポイントになります.

(4) GCPを使う

 インスタンスを複数立てる事で,簡単に実現出来ます. これも流行りの方法ですが,一応,自作PCブログですので...

0. 今回やること

ベース環境

基本方針

  • vertualenvを使って,Tensorflow ver 1.14.0とTensorflow ver 2.3.0を同一PCで使用する
  • Tensorflow ver. 1.14.0ではCUDA 10.0を,Tensorflor ver. 2.3.0ではCUDA 10.1を使用する
  • NVidiaドライバはver. 450.102.04で統一とする(ドライバver.を分ける必要がある場合には,vertualenvでは出来ません)

1. CUDAのインストール

 既に10.0が入っている状態から初めます.

f:id:changlikesdesktop:20210622100323p:plain:w400
既存のCUDA 10.0

 ここ*3からCUDA10.1を,ここ*4からcuDNN 7.6.5をダウンロードします. この方*5によると,ver.違いのCUDAはそれぞれ別のディレクトリにインストールされて干渉しないそうです. 別々に入っていれば,Tensorflow側で適合ver.を勝手に選ぶとのこと. なので,このままインストールしていきます.

CUDA 10.0へのシンボリックリンクを消す

f:id:changlikesdesktop:20210622101639p:plain:w500
CUDA 10.0へのシンボリックリンクが在ったので,削除

$ sudo unlink /usr/local/cuda

CUDA10.1をインストールする

$ sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub  
$ sudo dpkg -i cuda-repo-ubuntu1804-10-1-local-10.1.105-418.39_1.0-1_amd64.deb  
$ sudo apt update  
$ sudo apt install cuda-toolkit-10-1
$ reboot

cuDNN 7.6.5をインストールする

$ sudo dpkg -i libcudnn7_7.6.5.32-1+cuda10.1_amd64.deb
$ sudo dpkg -i libcudnn7-dev_7.6.5.32-1+cuda10.1_amd64.deb
$ sudo dpkg -i libcudnn7-doc_7.6.5.32-1+cuda10.1_amd64.deb

入ったか確認すると...何故かCUDA 10.2も入っとる???ここでまたシンボリックリンクを消しておく

$ ls /usr/local
$ sudo unlink /usr/local/cuda

f:id:changlikesdesktop:20210622113145p:plain:w500
/usr/localを確認

.bashrcを編集して環境変数を追加

export PATH="/usr/local/cuda-10.0/bin:$PATH"
export PATH="/usr/local/cuda-10.1/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda-10.0/lib64:$LD_LIBRARY_PATH"
export LD_LIBRARY_PATH="/usr/local/cuda-10.1/lib64:$LD_LIBRARY_PATH"

nvcc を打ってみると...10.1に変わっている

f:id:changlikesdesktop:20210622142625p:plain:w400
nvccの結果.CUDA 10.0が無くなっていないか不安になる

CUDA 10.0が無事か試す

$ python3  
>>> from tensorflow.python.client import device_lib  
>>> device_lib.list_local_devices()

f:id:changlikesdesktop:20210622114152p:plain:w500
libcudart.so.10.0が読み込まれているのでOK

2. Tensorflow v2のインストール

 /Python/tf2_env に環境を作ります

$ sudo apt update
$ sudo apt install virtualenv
$ cd ~/Python
$ mkdir tf2_env
$ virtualenv -p python3 tf2_env
$ source ./tf2_env/bin/activate

f:id:changlikesdesktop:20210622120253p:plain:w500
こんな感じでtf2_envに入る

pipでインストールする

$ pip3 install tensorflow==2.3.0

CUDA 10.1が呼び出されるか試すと,なんか失敗しているっぽい

$ python3  
>>> from tensorflow.python.client import device_lib  
>>> device_lib.list_local_devices()

f:id:changlikesdesktop:20210622133938p:plain:w500
libcublas.soが見つからないみたい

先刻何故か入っていると言ったCUDA 10.2の中に在るっぽいので,.bashrcにパスを追加する

export LD_LIBRARY_PATH="/usr/local/cuda-10.2/targets/x86_64-linux/lib:$LD_LIBRARY_PATH"

こんどは行けたっぽい

f:id:changlikesdesktop:20210622141359p:plain:w500
libcublas.soがロードされた

仮想環境から抜ける

$ deactivate

 取り敢えず,これで使ってみようと思います...(^^).

 

富士山ヒルクライム 69分22秒

 こんにちは.changです.

 富士山ヒルクライムに出場しました. 結果は69分22秒. 自己ベストを大幅に更新することができました(^^)

f:id:changlikesdesktop:20210607192450p:plain:w400
富士ヒルクライム2021. スタート前から小雨が降りました

0. レース準備

 富士ヒルは2年前に初めて出場し,もう少しというところでシルバーを逃していました*1. 年初には”富士ヒルゴールド(1時間5分)”を目標に掲げましたが,残念ながら,今の実力では厳しい事が分かっていました. このため1時間10分に目標を修正しました.

平日練(ローラー)

 1時間10分という事はほぼ1時間なので,FTPを維持することが最善と考えました. そこで富士チャレ*2後、平日練をFTP近辺を維持するワークアウト中心に替えました. ちなみに,富士チャレ前は無酸素域のワークアウトとZwiftレースをやっていました.

f:id:changlikesdesktop:20210607201326p:plain:w400
GCNから.キツくて嫌いなので当分やりません(笑)

f:id:changlikesdesktop:20210607193135p:plain:w400
これもGCN.L5の下側

f:id:changlikesdesktop:20210607193231p:plain:w400
Zwift Academyの中の一つ.FTP周辺をまんべんなく.レース週はこれをやってました

週末練(実走)

 土日の実走も少し変えました.

 普段は150 km程のロングに出ることが多いですが,ヒルクライムを意識して高強度のタイムトライアルを取り入れました. 15分位で登れる近所の林道が丁度開けたので,これを全力で3本走るトレーニングをしました.

 ヒルクライム前はどうしても長い登りに行きたくなりますが,1ヵ月前の試走を最後に敢えて控えました. 1時間のヒルクライムを一人で集中して走る事は難しいからです. 試走で(料金所から)1時間15分掛かっていたので,再トライでタイムを更新して安心したい気持ちもありましたが,,,我慢しました.

 トレーニングの成果か,少なくとも20分は4.5倍を維持できる感覚をつかんでいました. この感覚を頼りに,サイコンとにらめっこをしながら登る計画でした.

減量

 2年前は51kgまで絞ってました. 筋肉量が増えた所為で,今ここに戻すことは難しいです. 体脂肪率が5%位になり,日常生活に支障をきたすと思います. このため,52kg & 体脂肪率7%をターゲットにしました.

 落としたのは1~1.5kg程度ですが,トレーニングをこなしながらなのでそこそこ辛かったです. レース週の木曜日に目標をクリアしてからは,敢えて体重計に乗るのをやめて体調維持を意識しました.

1. レース当日

 コロナ過での開催ということで,チャンピオンクラス以外は号砲無しのフリースタートです. 僕は第5スタート(7:15)だったので,6:45頃に競技場に入りました.

 元々ネット計測なので,やることは一緒です. 「速い人は前から行くかな」と思っていたので,7:00位から列に並び,スタート後は(危険が無い程度の追い抜きで)前方にあがりました.

 タイム計測の開始直後はかなり速いと感じました. 有名ユーチューバーのご夫婦さんと一緒だったんですが,凄いペースなんです(汗). 時々パワーメータを見ると,5倍出ていました. 下がってマイペースに切り替えるか迷いましたが,良い感じでテンションが上がって来たのでそのまま集団の前方で走りました.

 2合目位から少し落ち着いたのかな...? 一人引きみたいな時間帯が多いものの(あの方も強かった),牽引を交代する選手がポツポツと現れます. 僕も牽引に参加しましたが,申し訳無いことに,あまりペースを上げられなかったです.

 集団の雰囲気は常にポジティブでした. 前述のご夫婦がコースを熟知していらっしゃって、「この先で(勾配が)緩くなるよ」みたいな声掛けをしてくれます. 一体感が生まれましたね. チャンピオンクラスでは無いのでアタック等は無く,協調して皆で良いタイムを出そうという感じでした. 走っていて気持ちが良かったです(^^).

 終始周りに選手がいてあまりサイコンを見ていなかったのですが,ペースが良い事は分かっていました. ゴール前のスプリントで少し離されましたが,大満足の走りです. タイムトライアルをやるつもりが,まさかこんなロードレースのような展開になるとは!!! 一緒に走って下さった方々に感謝です.

2. パワー分析

f:id:changlikesdesktop:20210607194747p:plain:w400
パワー計測結果.

f:id:changlikesdesktop:20210607194843p:plain:w400
レース中の推移.やはり,前半が少しオーバーペースだった様です

 NPが237.7Wというは驚きです. 平均心拍が167というのも過去に無く高い! 余程テンションが上がっていたんですね. というか,普段がダルなんだな...

 ちなみに,この日のTSSが178でした. ヒルクライムレースとは言え,1時間強のライドで150TSSを超えるのはおかしい気がします. 多分,FTP値が適当なのでしょう(汗).

 僕はローラーのFTPテストが嫌いでやった事がありません. ローラーで高強度を出すのが苦手なのと,数値が悪かった時に落ち込むのが嫌だからです. 20分テストとかすれば,250W位出るのかも知れないですね(やらないけど).

3. 今回良かった事

 今回の結果につながったと感じた事をメモします.

チェーンオイル: WAKOS CHAINLUB

 洗車後に直ぐさせるし,浸透も早いし,兎に角使いやすいです. 液体式の高いヤツも試したんですが,戻ってきました. おそらく、液体式は性能を引き出すのに(チェーンの乾燥などの)技術が要るのでしょう.

 注油した後の慣らしの重要性にも気づきました. これまで,レース前日に洗車と注油をしてそのままレースを走っていたのですが,今回はたまたま1週間前の練習中に雨に降られたタイミングで洗車しました. 平日のローラーはリム車なので,注油後一週間放置したことになります. 前日には,50km程の調整ライドに出ました.

 一週間の放置が良かったのか,前日の走りが慣らしになったのかは判りませんが,当日は今までに無くパイクを軽く感じました.

タイヤ: Panaracer GILLAR

 ヒルクライム用の決戦タイヤとして,今回導入しました. 25Cで170g程度なので,確かに軽量です. グリップに対する不安は多少ありますが、登りだけでは全く問題ありませんでした.

 ちなみに,今回のバイク重量は7.25kg(サイコン無し)でした.

アップ

 面倒くさくてローラを持って行かないことが多いのですが,,,重要さを実感しました. 15分弱程度のアップしか出来ませんでしたが,目標値のパワーを何度か出しておくと,身体の反応が良くなる気がします. ちなみに,僕は心拍の反応が鈍いので,サイコンはほぼパワー値だけを見ます.

 だたこれ,今回の苦労ポイントでもありました. 前日,MINOURAのハイブリッドにディスク車が乗らないことに気付きます. 止む無く,アップ用にリム車を持っていくことに... この所為で,当日の詰め込みが15分増しでした. 三本ローラーを買うかな…

f:id:changlikesdesktop:20210607200904p:plain:w400
ローラー用に2台目を積むことに(泣)

フリースタート形式

 コロナ渦の応急処置ではありますが,良い点も多いと感じました。 お手洗い前の行列はヒルクライムの風物詩みたいなものですが,それが解消されます. 会場入りする時間もバラバラになるので,交通渋滞も減りますよね. チャンピオンクラス以外はこれで良いんじゃないかな?

 問題は,主催者の挨拶とか,ライダースミーティングを一同に行えないことでしょうか. 事前に動画配信するとか工夫すれば,クリアできる気がします.

4. 終わりに

 少し燃え尽きた感がありますね. 乗鞍までは少し時間があります. 減量を一区切りにして,我慢していたビールとお菓子をたしなむつもりです.

 今回70分で走ってみて、改めてゴールドヒィニッシュの難しさを感じました. 間違いなく,5倍が必要ですね. 30代最後の年となる来年が狙い所です. 気持ちが戻ったら,またトレーニングを積みたいと思います.

f:id:changlikesdesktop:20210607201035p:plain:w400
だいぶ相棒っぽくなったかな...

# CloudCompareをViusal Studioでデバッグする

 公式を見ながら*1悪戦苦闘した記録.

0. 環境

1. 必要資源の取得

(1) CloudCompareの最新ソースを取得

$ cd C:\Tools
$ mkdir CloudCompare
$ cd CloudCompare
$ git clone --recursive https://github.com/cloudcompare/CloudCompare.git

Note:

  • C:\Tools下にソースを取得
  • Git bashを使ったが,コマンドプロンプトでも何でも良い
  • インストール時のver. は下記
    f:id:changlikesdesktop:20210507040415p:plain:w200
    ビルド時のver.

(2) CMake-guiをダウンロード*2

f:id:changlikesdesktop:20210507040941p:plain:w600
cmakeのZIP版を取得

Note:

  • インストーラでも良いと思うが,今回はZIPを取得
  • 解凍して適当な場所に置いておく
  • この後で使う cmake-3.20.2-windows-x86_64\bin\cmake-gui.exe をスタートアップにピン留めすると便利

(3) Qtをインストール

f:id:changlikesdesktop:20210507041911p:plain:w600
ここ*3からダウンロード

f:id:changlikesdesktop:20210507043520p:plain:w400
custom installationを選択

f:id:changlikesdesktop:20210507043610p:plain:w400
MSVC 2017 64-bitをチェック

f:id:changlikesdesktop:20210507043708p:plain:w400
スゲー時間かかかる

Note:

  • ここ*4で綺麗に説明されていた
  • Qtのアカウント確定メールが迷惑メールに振り分けられて少し迷った

2. Visual Studioのプロジェクトファイルを出力

f:id:changlikesdesktop:20210507051136p:plain:w400
cmake-guiを起動し,ソースの場所とビルド先を指定してConfigure

f:id:changlikesdesktop:20210507054315p:plain:w300
Visual Studio 2017,x64を指定

f:id:changlikesdesktop:20210507051552p:plain:w400
Qt5_DirがNOT FOUNDになる.Qtのインストール先からパスを指定して再度Configure

f:id:changlikesdesktop:20210507052009p:plain:w400
今度はQt5LinquistTools_DirがNOT FOUNDになる.これもパスを指定してConfigure

f:id:changlikesdesktop:20210507052203p:plain:w400
エラーが無くなったのでGenerate

f:id:changlikesdesktop:20210507052438p:plain:w400
先刻指定したBuild先にslnが出来るので,起動する

f:id:changlikesdesktop:20210507075246p:plain
INSTALLをビルド.CloudCompareをスタートアッププロジェクトに設定しておく

f:id:changlikesdesktop:20210507075345p:plain:w400
C:\Program Files下にCloudCompareProjectsができる.CloudCompare_debug内のdllとフォルダをbuild\qCC\Debugにコピー

f:id:changlikesdesktop:20210507080015p:plain:w400
デバッガを起動

Note:

  • 書き込み権限の問題でCloudCopmareProjectsが出来ない場合は,Visual Studioを管理者権限で実行する
  • Linuxでも同様の事が出来ると思うが,gdb単体でデバッグするのはツラい...統合環境とかみ合うか,今度やってみる

追記(2021/5/11)

 Program Filesから持ってきたdllでは,dllの中身をデバッグできない.dllの中に入りたいときは,lib内の個別プロジェクトにできるdllとシンボルを実行フォルダにコピーする.例えば:

f:id:changlikesdesktop:20210511051256p:plain:w400
dll内のデバッグにはシンボルが必要.pdbだけコピーすると何故か駄目で,dllも一緒にコピーした

富士チャレンジカップ ソロ100 km: 57位

 こんにちは.changです.

 富士チャレンジカップ ソロ100kmに出場しました. ゴールドフィニッシュを目標に走りましたが,結果は2時間23分で57位. 力を出し切りましたが,(上位5%ルールにより)目標には届きませんでした.

f:id:changlikesdesktop:20210426191144p:plain:w400
晴天の富士スピードウェイ

0. 午前午後の2部構成

 COVID 19への配慮からか,今年は午前・午後の2部開催になりました. スタートリストを見ると,僕が出場した午前の部のエントリーは470名でした. 例年1000名程が出走することを考えると確かに少ないですが,感覚的には,ゆっくり勢が減っただけでレースレベルは変わらなかったと思います. 上位5%に入る難易度は,前回大会よりも高かったかも知れないですね.

1. レース展開

 静かに,ずーーーっと速いレースでした.

 前々回は豪雨で,周回毎の落車発生の挙句,途中ストップでした. 前回は周回スプリントにボーナスタイムが付いた関係か,所々でレースが荒れました. それに比べると,今年は淡々としていました. アタックも殆ど無く,黙々とペースを刻む感じでした. 複雑な状況下でのレース開催でしたし,皆さん慎重に走られたのかも知れません.

 展開の中で,自身のレベルアップを感じていました. 勿論,楽に付いていけた訳はありません. それでも,ホームストレートをこなしながら集団の前に上がる余裕がありましたし,補給もしっかり取れていました.

 トラブルと言えば,ボトルを落とした事ですね. 軽量化しようと中身を捨てていた時に手を滑らせました. 後方のライダーさんの落車を引き起こすかと一瞬不安になりましたが,大丈夫だったようです.

 14周回か15週回目に一度千切れます. 登りの前で少し下がってしまって,中切れに遭ったと記憶しています. ホームストレートで離された時には,レースが終わったと思いました. 幸い,同じ境遇の方達のトレインに乗って集団復帰できました. ただ,脚はかなり使ってしまいました.

 終盤のペースアップを警戒してましたが,思った程にはペースが上がりませんでした. サイコンの結果を見ると17周回目から若干上がった様ですが,明らかなペースアップがあったのはラスト一周だけでした. それも,(感覚的には)最後の登りだけをワッと踏んだ感じでした. ダンロップコーナーの前で集団の前方に上がったまでは良かったのですが,ゴールに向けて食らいつくだけの脚がありませんでした. 最終的に,トップから30秒遅れでのフィニッシュになりました.

2. パフォーマンス分析

 前回とパフォーマンス比較をしてみました.

f:id:changlikesdesktop:20210426192439p:plain:w400
前回(2年前)のパワー分析

f:id:changlikesdesktop:20210426192536p:plain:w400
今回のパワー分析

 正直,我ながら強くなったと思います. 単純にFTPが20 W程上がっているので,それがそのまま結果に現れた形です. ただ,平均ケーデンス83,最大心拍170というのはパワーに頼り過ぎですね. 余裕のある局面では脚を回して,最終盤にパワーを残すような工夫が必要かと思いました.

Note

 パワーメータが変わっているので,純粋比較では無いです. 感覚的には,新車につけているパワメの方が5W増しです.

f:id:changlikesdesktop:20210426195537p:plain:w400
前回の中盤ラップタイム.タレまくっとる...

f:id:changlikesdesktop:20210426195617p:plain:w400
今回の中盤ラップタイム.画像が切れてますが,最終ラップはNP 203Wでした.終盤に脚を残せてましたね

 中盤のラップをみても,タレ無くなったよね...

 トレーニングの成果を発揮しても目標に届かなかったのは,正直,残念です. 練習しているのは,自分だけでは無いという事ですね. いつもチャンネルを見ている有名ユーチューバーさんと何度か並走しましたが,メチャクチャ強くなっていました. 勝手な親心で嬉しくなりました(^^). 富士ヒルでは負けませんよ!

 課題は,やはり短時間高出力ですね. 脚に余裕があるつもりなのに,最終スプリントに残れないのが致命的です. ただ,僕が10倍を出しても精々500Wの前半なので,ゴールスプリントでは間違いなく勝てません. 自身が目指す競技イメージを固めていくことも必要だと思います.

3. 新機材

 新機材*1で初めてレースを走りました. 速さはお金で買えないと思ってますが,効果はかなりあったと思います.

 間違いなく良くなったのが下りです. 前回は第一コーナーからの下りで毎回苦しみました. 今年はそれが無いどころか,エアロポジションを取って脚を休めることが出来ました. エアロダイナミクスの賜物でしょう.

 脚残りも良かったと思います. 前回の富士チャレで両足攣りにあったり*2,川崎マリンで腰痛になったりした*3のに比べると,身体の痛みは殆ど無かったです. その所為で,集団内の位置取りに集中できた気がします.

 このバイクでレースを走るのが楽しみで仕方がありません. 不甲斐ない僕ですが,末永く宜しくお願いします!

4. おわりに

 目標には届きませんでしたが,自身の最高のパフォーマンスを出せたことには満足しています. ただ,やっとレースを出来るレベルに来たに過ぎません. 勝利に絡むには,更にもう数ランクのレベルアップが必要と感じます. その為に何をすべきか,また考えて行きたいと思います.

 富士チャレは,2.5年前に僕が初めて出場したレースです. チームに入ったばかりで右も左も分からない中,チームメートに励まされながら走りました. 流行り病で世の中が大変な状況の中,皆でワイワイとレースに行く感じではなくなってしまったことが少し寂しいです. ただ,”レース”という事で言えば,例え流行病が無くても,いつまでも続けられるものでは無いですよね. レースを走れる喜びを噛みしめながら,一戦一戦を走ろうと思います. 同時に,自転車の楽しみ方の幅を広げて,チームメートと共に自転車ライフを楽しんでいきたいです.

 GW中に下総に行こうと思ってましたが,マンボウも出るので自粛することにしました. 富士ヒルクライムが開催されることを願います.

npmが入らない(泣).やはりPythonアプリ厳しい? という話

 こんにちは.changです.

 ふとした事情から,以前に試したReNomを再度使おうとしたところ,セットアップできずに断念しました. この記事の目的はReNomを動かすことではありません. Pythonをベースとした(主にディープラーニング関連の)アプリケーション開発のリスクについて,再考することです.

0. ReNom再セットアップ

 以前のメモ*1に沿ってインストールしようとしました. つまずいたのは↓です.

$ sudo apt install -y nodejs npm

 npmのインストールが失敗するようなので調べてみると,同様のトラブルを経験している方がいらっしゃいました*2

 nodeをソースから入れろということみたいなので試してみます.

  • 古いver.をとりあえず消す
$ sudo apt-get remove nodejs
$ sudo apt-get remove npm
  • ソースを取得してインストール
$ sudo apt-get install curl
$ curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
$ sudo apt-get install -y nodejs

ver.確認

$ node -v
v8.10.0

 この後で再度npmを入れようとしましたが,同じエラーになりました. 以前にセットアップしたときはnodeがv10.15.3だったので,ver.が不整合なのかも知れません. v10を入れるための方法をまとめてくれた方がいらっしゃった*3ので試しましたが,僕の環境ではv8しか入りませんでした.

 で,結局入らないのでReNomの公式サイトを見たところ,以前には無かったpipのインストーラが公開されていました.

  • ReNomTAGを入れる
$ pip3 install https://grid-devs.gitlab.io/ReNomTAG/bin/renom_tag-1.4b1-py3-none-any.whl
  • 起動成功
$ python3 -m renom_tag
Bottle v0.12.13 server starting up (using WSGIRefServer())...
Listening on http://0.0.0.0:8080/
Hit Ctrl-C to quit.

 同様にReNomIMGもpipで入れてみましたが,こちらは起動エラーになりました.

$ pip3 install https://grid-devs.gitlab.io/ReNomIMG/bin/renom_img-2.4b5-cp36-cp36m-linux_x86_64.whl
$ python3 -m renom_img
Traceback (most recent call last):
File "/usr/lib/python3.6/runpy.py", line 193, in _run_module_as_main
  "__main__", mod_spec)
File "/usr/lib/python3.6/runpy.py", line 85, in _run_code
  exec(code, run_globals)
...(省略)...
  from pandas.core.dtypes.cast import (
ImportError: cannot import name 'maybe_downcast_numeric'

 ここで断念しました. ちなみに,以前はgithubからソースを取得してインストールしたのですが,現在はソースが非公開になった様です.

1. Pythonアプリについて

 以前に,ユーザに納品するソフトのバックグラウンドにPythonを使用するのは危険という話をしました*4. 今回の経験は,Pythonを含んだ,Web経由でインストールするオープンソース資源を使うことのリスクという事になります.

 前回にReNomをセットアップしたのが,丁度2年前です. 開発者の感覚からすると,2年前の資源が使えないのは当たり前です. むしろ,2年間も環境が更新されていないのならば,開発の進捗が心配になります. でも,ユーザにはそう言えないです. 納品時のHDのミラーを残す等で緊急対応は出来るでしょうが,,,システムファイルとデータファイルを上手くわけられればね.

 今回の経験からは少し飛躍しますが,やはり,Pythonベースのディープラーニング環境をユーザのパソコンに入れるのは難しいと思いました. やるなら,自社のクラウド上に構築&メンテナンスした環境を,ユーザーにログインして使ってもらうのでしょう. ただ,最新環境を維持しようとすると,少なからず,ユーザ側のオペレーションも変わるハズです. その辺の理解を得ることが必要かと思います.

2. むすび

 また愚痴っぽい話になりました. 別にReNomを批判するつもりはありません. 環境の再構築は別の機会に試してみるつもりです.

新車: Izalco max disc 買いました!

 こんにちは.changです.

 私事ですが新車を購入しました. 人生に何回も無い機会なので,勝手にレビューをしようと思います.

f:id:changlikesdesktop:20210417043505p:plain:w400
Fully Armoured Izalco max. 納品時にショップにて

 結論だけ先にまとめておくと:

気に入っているところ

  • 見た目
  • 特別な感想がわかないところ(=違和感がない)

気に入らないところ

  • 前モデル程にはハンドルを下げられない
  • 前輪と足の位置関係がシビア
  • 盗難が怖くて気軽に乗れない

0. 機材構成

  • Frameset: FOCUS Izalco max disc, XSサイズ
  • Front/Rear brake: Shimano Dura-Ace
  • Rotors: SHIMANO XTR
  • Brake/shift levers: Shimano Dura-Ace Di2
  • Front/Rear derailleur: Shimano Dura-Ace Di2
  • Chainring: Shimano Dura-Ace 52-36
  • Cassette: Shimano Dura-Ace 11-30
  • Chain: Shimano Dura-Ace
  • Crankset: Shimano Dura-Ace, Size:170
  • Power meter: SHIMANO
  • Bottom bracket: WISHBONE
  • Wheelset: ROVAL Rapide CLX
  • Tyres: Continental Grand Prix 5000, 25mm
  • Tubes: SCHWALBE Extra Light
  • Handlebars: Easton EC90 AERO, 40 cm
  • Handlebar tape: スパカズ
  • Stem: FOCUS (専用品), 100mm
  • Computer mount: FOCUS (専用品)
  • Pedals: Shimano Ultegra PD-6800 (流用)
  • Saddle: Selle San Marco Aspide
  • Seat post: FOCUS (専用品)
  • Bottle cages: Elite ROCKO
  • Computer: Pioneer SGX-600 (流用)
  • Bike weight: 7.4 kg(サイコン無し)

 参考までに今まで乗っていたリム車の構成も載せておきます.

  • Frameset: FOCUS Izalco max, XSサイズ
  • Front/Rear brake: Shimano Ultegra
  • Brake/shift levers: Shimano Ultegra
  • Front/Rear derailleur: Shimano Ultegra
  • Chain ring: Shimano Ultegra 50-34
  • Cassette: Shimano Dura-Ace 11-28
  • Chain: Shimano Dura-Ace
  • Crankset: Shimano Ultegra, Size:170
  • Power meter: Pioneer
  • Bottom bracket: ???
  • Wheelset: Mavic Cosmic Carbon SL, 45 mm height
  • Tyres: Vittoria Colsa Graphene 2.0, 25mm
  • Tubes: 無し
  • Handlebars: Item ARIES SL, 40 cm
  • Handlebar tape: スパカズ
  • Stem: Item Kero, 90mm
  • Computer mount: Pioneer 付属品
  • Pedals: Shimano Ultegra
  • Saddle: Selle San Marco Aspide
  • Seat post: CONCEPT CPX
  • Bottle cages: Elite CARNNIVAL XC
  • Computer: Pioneer SGX-600
  • Bike weight: 7.2 kg(サイコン無し)

Ultegraは6800系です

1. 選定理由

 Tarmac SL7に並々ならぬ興味があったのですが,,,あまりにも色々な方が絶賛していて冷めてしまいました. ひねくれ者なもので,人気が出ると嫌いになるのです.

 で,色々比較検討した訳ですが,,,最終的には,どれもあまり変わらないと思って見た目で選びました(笑).

f:id:changlikesdesktop:20210417045342p:plain:w400
比較検討の跡.仕事もこの位真面目にやれればね...

 他ブランドとは一線を画したデザインが胸キュンです. 買ってから気がづきましたが,ガンダムカラーなんですね. 密かに木馬と呼んでます.

f:id:changlikesdesktop:20210417050035p:plain:w400
外観1
f:id:changlikesdesktop:20210417050111p:plain:w400
外観2

2. 半年程乗ってみて

 有名なライダーさんが発言されている*1*2通りで,乗り心地は柔らかいです. バイク全体がバランス良く仕上がるので,真ん中を捉えやすい印象があります. ダンシングが心地よく,登坂時の重量も気になりません.

 実際,元々乗っていたIzalcoのリム車と比較して200 g程しか重量が変わりません. 部品を選ぶ際,”リム車と同等の重量にする”ことを意識しました. その所為でかなりお金がかかってしまいました... それでも,更に200 g削りたい気持ちはあります. キリがないなぁ... 流用しているペダルをデュラ化して,ハンドルとステムを軽くすれば実現できると思ってます. それが限界かな.

 このバイクは,100%レース目的で買いました. 未だレースでは使ってませんが,長距離のレース程有利になると思っています. 身体へのダメージが少なく,脚残りが良いからです.

 激坂系ヒルクライムにどっち(新車=ディスク or 旧車=リム)を使うか,迷っています. 僕のフィールドで言うと,箱根ヒルクライムですね. 軽量化してリム車と同じ重量になるなら,新車で出ると思います. タイムトライアルのデータを積み,判断するつもりです.

 "レース目的で買った"と書きましたが,ロングライドを楽しまれる方にもおススメのバイクです. 前述した様に脚残りが良いので,長時間のライドに向いています. 僕自身も,150 kmを超えるライドでの疲労感がリム車よりも少ない感覚を持っています. ただ,そこそこ高価な機材にはなってしまうので,観光地などに駐車される際には盗難に注意されると良いかと思います.

NOTE

 自転車自体は半年以上前に組みあがっていました. サイコンを見ると,3500 km程乗っています. 煮え切らなかった事情がありまして,ホイールがなかなか納品されなかったのです. 2ヵ月程前にやっとフル装備になりました.

3. 何故今買ったか?

 以前に書きました*3が,新デュラの発表が遅れている関係から,多くのロード乗りが財布の紐を占めていますね. もう1年位待てば普通に買えるようになるでしょう. それまで我慢する選択肢もありましたが,単純に,今乗りたいから,今買いました. 年齢的に,自分のパフォーマンスを上げ続けられるのは後数年だと思っています. そこまで届かずに飽きてしまう可能性もあります. 今ここまで夢中になれているので,とことんやってみようと思いました. その為の相棒が欲しかったのです.

4. 購入される際の注意点

 一応というか,ネガティブなポイントを挙げておきます.

ポジションの問題

f:id:changlikesdesktop:20210417055216p:plain:w400
Izalcoリム車.ハンドルが下げられて好みでした.

 写真は僕のIzalcoリム車ですが,ハンドルを目いっぱい下げています. サドル-ハンドルトップ間の落差が90 mmです. Izalco discでは,限界までステムを下げても,Izalcoリム車よりも数センチ高いポジションになります. 止む無く,エアロハンドルの効果が薄れるのを覚悟で,ハンドルを前に倒して好みのポジションを実現しています.

 専用ステムを諦めればハンドルを下げられるそうですが,格好悪くなります. せっかくのエアロロード & エアロハンドルですし,悩みどころです.

前輪と足の位置関係がシビア

f:id:changlikesdesktop:20210417054748p:plain:w400
足と前輪が干渉して,ヒヤッとすることがあります

 小さなフレームなので仕方がないですが,シューズと前輪が干渉し易いです. Izalcoリム車と同じXSサイズに乗っていますが,よりシビアになったと感じます. スタンディング時(特に,前脚と反対側にハンドルを切る方)などには注意が必要かと思います.

5. むすび

 富士チャレで新車レースデビューの予定です. 首都圏にマンボウが出される様ですね. 中止にならないことを祈っています.

 焦らされたホイールについては,改めて感想を書きたいと思っています.

Four AI players learned bike race with Q Learning

This article is a translation of Japanese ver.
Original ver. is here*1.

 Hi, this is chang. In this article, 4 artificial intelligent racers (M*cEwan, P*tacchi, C*vendish, C*nchellara) competed each other and learned their tactics.

0. Bicycle road race

 Bicycle road race is spectacle. It has some special factors like slipstream. They make race complex and full of humanity. To check the background knowledge for seeing bike race, please see the published articles*2*3.

 Today I used 4 riders as models. I guess if you know them, you can enjoy the article much more. I picked YouTube videos that featured them*4*5*6*7. I hope the videos help you. Sorry but I could not find the information source that compared the characteristics of the four.

1. Program

(1) Field

 Race is competed on the image of 32 × 12. It starts from the upper edge. If an agent reaches the bottom edge before rivals, it wins. The bar at the right side of the image shows the remaining energy of riders.

 Today I increased the width from 8 to 12 because of increased players.

f:id:changlikesdesktop:20210304064842p:plain:w400
Field

(2) Player

 Today I did not distinguish between players and competitors. Instead, 4 players equally competed against each other.

M*cEwan

f:id:changlikesdesktop:20210304065929p:plain:w300
M*cEwan

  • actions of 5 patterns
  • 1 and 2 dash consumes 1 and 2 energy, respectively
  • Super sprint with energy shortage goes only remaining energy value
  • If remaining energy is 0, sprint(0) and super sprint(4) is the same to go straight(2)
  • Initial energy is 5
  • Big lateral motion with 2 pixels are set for catching the wheels of rivals.
  • M*cEwan type: weak in long sprint(=small initial energy) but good at quick action(=big lateral move)

P*tacchi

f:id:changlikesdesktop:20210304100359p:plain:w300
P*tacchi

  • actions of 5 patterns
  • 1 and 2 dash consumes 1 and 2 energy, respectively
  • Super sprint with energy shortage goes only remaining energy value
  • If remaining energy is 0, sprint(0) and super sprint(4) is the same to go straight(2)
  • Initial energy is 6
  • P*tacchi type: Large body(=small lateral move) and good at long sprint(=large initial energy)

C*vendish

f:id:changlikesdesktop:20210304100723p:plain:w300
C*vendish

  • actions of 5 patterns
  • 1 and 3 dash consumes 1 and 3 energy, respectively
  • Super sprint with energy shortage goes only remaining energy value
  • If remaining energy is 0, sprint(0) and super sprint(4) is the same to go straight(2)
  • Initial energy is 5
  • C*vendish type: Superior in explorive power(=super sprint of 3 pixels)

C*nchellara

f:id:changlikesdesktop:20210304100749p:plain:w300
C*nchellara

  • actions of 5 patterns
  • 1 dash consumes 1 energy
  • If remaining energy is 0, sprint(0 or 4) is the same to go straight(2)
  • Initial energy is 10
  • C\nchellara type: Poor sprint(=no super sprint) but special in endurance(=large initial energy)

(3) Slipstream

 I imitated slipstream using simple rules. Players can recover their energy by taking back of rivals.

f:id:changlikesdesktop:20210304071517p:plain:w300
Imitated slipstream

  • If a player is 1 pixel behind of others, the player's energy recovers 2
  • If a player is 2 pixel behind of others, the player's energy recovers 1

(4) Reward

  • Win: 1.0
  • Lose: -1.0

 I used the all or nothing concept like the previous. If drawn, reward is the same to lose(=-1.0).

Note: Please also check published articles to check the detail of the program.

2. Result

 There were much more variation in results because of increased players. Although I wanted to test cases as many as possible, it took time. So I stopped calculation at 10 cases.

(1) Winning percentage

Case M*cEwan P*tacchi C*vendish C*ncellara Draw
0 0.073 0.157 0.503 0.000 0.267
1 0.497 0.107 0.177 0.000 0.219
2 0.037 0.010 0.057 0.010 0.886
3 0.390 0.013 0.123 0.003 0.597
4 0.133 0.320 0.130 0.000 0.417
5 0.033 0.017 0.087 0.003 0.860
6 0.043 0.817 0.063 0.000 0.077
7 0.650 0.120 0.040 0.020 0.170
8 0.023 0.330 0.247 0.200 0.200
9 0.220 0.250 0.247 0.033 0.250
Sum 0.210 0.210 0.170 0.030 0.390

 Table above shows the winning percentage of 300 races using neural networks after training. It showed that:

  • M*cEwan and P*tacchi dominated races
  • C*vendish was ranked in third
  • C*anchellara was an only loser

Note: I would like to say that I do not have a hate on C*nchellara

(2) Race tactics

 I made gif animations of the winning pattern of each racer. The gif animations of all the cases are here*8.

f:id:changlikesdesktop:20210303175056g:plain:w500
M*cEwan(red) sprinted from behind rivals. Extract of Case 1
f:id:changlikesdesktop:20210303175206g:plain:w500
P*tacchi(orange) sprinted from behind rivals. Extract from Case 6
f:id:changlikesdesktop:20210303175237g:plain:w500
C*vendish(yellow) super-sprinted from behind rivals. Extract of Case 9
f:id:changlikesdesktop:20210303175310g:plain:w500
C*anchellara(sky-blue) overpowered. No training. He was the strongest in random motions, at the early stage of learning

Case M*cEwan P*taccchi C*vendish C*nchellara
0 / / break /
1 splint / / /
2 break / break /
3 break / break /
4 break sprint break /
5 break / break /
6 / sprint / /
7 break / / /
8 break sprint sprint /
9 break sprint sprint /

 The table above shows the tactics of each case. I felt that the tactics were naive compared to previous tests with two players*9*10. Although they learned goal sprints, they often went too fast and lose legs before finish. In addition, all the four did not battle for races. In many cases, only two sprinted and the rest looked on from behind.

3. Consideration

(1) Training epochs

 One of the causes for poor tactics was just a lack of training epochs.

f:id:changlikesdesktop:20210304090532p:plain:w400
Winning percentage during learning of Case 0

 Above is the transition of winning percentage during training of case 0. The wins of P*tacchis and C*vendish increased at about 25000 epoch and kept rising till the end(50000 epoch). It is possible that more skilled sprint was acquired with additional training. Although I increased epoch from 20000 to 50000 today, it did not seem to be enough. I think this is because the variation in the field were dramatically increased with increased players.

(2) Negative brain

 Not all the four players were aggressive in many cases. I'm trying to understand this phenomena.

 Let's see again the transition of winning percentage of case 0. When M*cEwan and C*vendish improved at 25000 epochs, the wins of C*nchellara decreased. In this program, only the four players exist. So if one wins, other one necessarily loses. It was difficult to train all the players at the same time.

 In many cases, C*nchellara dominated races at the early stage of training, 25000 epoch or less. This is because his high initial energy is quite advantageous in random motions. But shown in the gif aminations above, C*nchellara tended to lose with his energy remained. If he used his energy, he may win. But he did not do that. I think his neural network, that gained reward with random motions in the early stage of training, denied when rivals became strong. The winning pattern of the past was destroyed. In the result, the network fell into the situation of negative brain.

 The riders in real sometimes lose their rhythm after a series of loses. I guess it is the similar situation.

train.py

if terminal:
    # experience replay
    if reward_t[0] > 0:
        agent1.experience_replay()
    elif reward_t[1] > 0:
        agent2.experience_replay()
    elif reward_t[2] > 0:
        agent3.experience_replay()
    elif reward_t[3] > 0:
        agent4.experience_replay()

 By the way, we today have 4 players. Each player learned more loses than wins (lose 3/4 and won 1/4) and was easy to be in negative brain. So I tried to use only the experience of wins like the code above. Sadly, it did not work well.

dqn_agent.py

class DQNAgent:
    ...
    def __init__(self, enable_actions, input_shape, environment_name, model_name):
        ...
        self.replay_memory_size = 10

 In addition, to forget the past loses, I set the replay memory size as 10 races. It also did not work well. I guess that the experience of loses gradually increased and dominated the memory in the end.

 In real, riders do not always run the same races. In many cases, riders trained in their home countries and face in big races. It is possible that training in different races has the efficiency to avoid the negative brain. Like Fabian Canchellara of 2010 and Philippe Girbert in 2011, a rider sometimes dominates the big races. I think it is possible that many rivals were in the state of negative brain.

 In trial, I gathered the networks that riders were up-beated (M*cEwan: Case 1, P*tacchi: Case 6, C*vendish: Case 0, C*ncheralla: random) and made them race. So aggressive!!! Never tired of watching close battles.

f:id:changlikesdesktop:20210303184209g:plain:w200
Race among positive brains. Example 1(6 races). Red=M*cEwan, Orange=P*tacchi, Yellow=C*vendish, Sky blue=C*nchellara
f:id:changlikesdesktop:20210303184308g:plain:w200
Race among positive brains. Example 2(6 races). Red=M*cEwan, Orange=P*tacchi, Yellow=C*vendish, Sky blue=C*nchellara

(3) C*nchellara was a trainig rival

 I am afraid of bashing from Canchellara's funs... I say this again. I do not have a hate on him. I'm writing objective analysis about the phenomena.

 Fact, C*nchellra was an only loser today, but he played an important role in competition. Let's see the learning transition of case 0 again. P*tacchi and C*vendish were likely to become strong through the fight with C*nchellara.

f:id:changlikesdesktop:20210304093025p:plain:w400
Win rate during learning of Case 2

 It is obvious in case 2 shown above. Case 2 had many drawn game and tended to be boring.

 In the winning transition of case 2, C*nchellara's dominance at the early stage of training did not happen. No players rose their winning rate. In the result, so many drawn games made all the players be defensive. It shows that all the players fall into numb without rivals who take a risk. I can say that elegant tactics generate from the battle against the strong, physically superior(=great initial energy in this game) rivals.

4. Afterward

 It may be possible to mention not only the tactical aspects but also the training plans based on the brain science.

 By the way, it was quite hard to edit the article because the learning took a lot of time. My computer worked with illumination at night and prevented my sleep. And to he honest, translation is also bothersome, ha ha ha... I have to pay with attention on my health.

 Next, I will try the race with team. I wonder why C*vendish was not well today. His characteristics must be strong if he saves power till the end of races. The race among personals, that requires riders to chase breakes by themselves, was not suit for him. I do want to observe the super sprint of C*vendish from the team train.

 I updated the source code*11