01. 緊急事案対応

定年退職後から既に二年半経った2020/10、ディープラーニング勉強に向け猪突猛進し、テキストのサンプルプログラムを動かすため様々な難関を解決してきました。

しかしここにきて思うのは、ディープラーニングの勉強以上に提供されているモジュール等々が動かなかったり、何かの原因で以前動いていたものが動かなくなるといったオカルト現象が結構頻繁に起こるということです。

このままだと問題をクリアしてもパソコンが壊れて再びインストールする際に、再び同じ問題に直面してしまいます。

そこで、これ以降発生した問題について、何が原因で、どう対処したかを記録として残したいと思います。

01.01a 突然のDLL初期化ルーチンに失敗

【現 象】

最近GPU仕様で試験していたので、処理速度比較のためにLENOVO 310Sで動かしてみることにしました。

少なくともGPU仕様PCを購入前まで具体的にはKeras GAN編の前までは問題なく動いていた実績があります。 ところが以前動いていたKerasを使うサンプルプログラムのほとんどが

    「ダイナミック リンク ライブラリ (DLL) 初期化ルーチンの実行に失敗しました

になってしまいました。



★ 推測した原因
tensorboardが既に機能不全に陥っていたため、Kerasの一部が破損したためと推測しました。


★ 推定原因に対する対処
Anacondaをアンインストールして再インストールしてみました(所要時間2日)。

その際わかりやすいように仮想環境名とpython・tensorflowバージョンの関係を

    仮想環境 py35    python 3.5    tensorflow 1.8
    仮想環境 py36    python 3.6    tensorflow 2.2(最新)

のように設定しました。

インストール後の試験結果はNGでした。かなり昔のKerasサンプルで試験してもやっぱり同じようにエラーとなり、お手上げ状態です。


★ pythonモジュールのインストール裏技
仮想環境作成後別のPCと同じ環境を設定するのは以前は1つ1つやっていましたが、裏技があるのでやってみます。

その前にAnacondaには「Anaconda Navigator」があってクローンボタンがあるのですぐにできるのかと思ってやってみると旨く行かないので別の裏技でやってみます。

アンインストール前に事前に「pip freeze」で現在インストールモジュールをリダイレクトでバックアップしておいて、仮想環境作成後「-r」で戻す方法です。

pip freeze > requirements.txt
pip install -r requirements.txt

この方法においても複数のエラーがあるので見逃さないように。

    ・ 「pip freeze」はバージョン指定にするため、複数個pythonバージョンに対応し無いとエラー

    ・ condaでインストールしたものは個別でインストール

    ・ Anacondaにすべにあるモジュールは不要

個別に対応すれば、すべてクリアされます。



【原 因】

二回セットアップをやり直しても同じでお手上げになったため諦めて、詳細に原因を調査しました。

その結果大変なことが分かってきました。

原因はパソコン 具体的には「CPU」に問題があることが分かりました。


簡単に説明すると、当たり前の話ですがtensorflowは該当バージョンを作っている時代の「標準的ライブラリ」や「標準的モジュール」を使用しているため依存関係が成立します。

「pip」でインストールすると、その標準形がダウンロードされてきますので作成時のまま下記のような構成でダウンロードされてきます。

    デフォルト「tensorflow」        ← 標準的パソコン対応用ライブラリー
                ↓
    ダウンロード用パッケージとしてダウンロード
                ↓
    インストール


問題は「標準的」という部分で、時代とともにtensorflowも「より高速」「より正確」になるようバージョンを上げて改変されてきますが、それと同時にパソコンの性能も上がるため「標準的」の基準がハードウエア変化とともに変わってきます。

その中の1つにintelの第二世代Coreプロセッサが採用したAVXという機能があります。

『Intel AVX【Intel Advanced Vector Extensions】とは、Intel社のマイクロプロセッサ(MPU/CPU)に内蔵された拡張命令セットの一つで、複数のデータに一度に同じ演算を行うことができるSIMD方式の処理』


軽く簡単に説明すると、

プロセッサーの内部処理は整数系と浮動小数点系では別系列で行いレジスタも各々専用レジスタを持っています。

このレジスタのサイズは表現する値の精度に関係しますが、このサイズはCPUのメーカーや型で仕様が決まっています。浮動小数点レジスタも当然大きなサイズの方が精度が高いわけですが、例えばpython上では整数・浮動小数点で単精度か倍精度かの区別はありますがレジスタの大きさを考慮に入れることはありません。

つまりpython上ではレジスタサイズには影響されず行われます、例えばCPUのレジスタが32ビットしかないのに64ビット計算を行うと二個32ビットレジスタを使用して計算を行います。その際使用するクロックは2倍になり、その分遅延します。これは整数系でも同じですが、結局ものすごく大きなレジスタを持つか1クロックで大きなビット数の演算ができれば、より高速になるわけです。

それを解決したのは、AVX【Intel Advanced Vector Extensions】で複数データを1命令演算できる拡張命令セットが用意され、より高速になりました。そうすると、新しいアーキテクチャーで新命令セットに対応する必要があります。

それは、tensorflowも例外ではなく、ここでいう「標準形」は新しいアーキテクチャーに対応したライブラリが作成されて使用しています。

そうすると、必然的に廉価版や古いCPUを搭載したパソコンには「AVX」が搭載されていないために、動かなくなるわけです。



【対 策】

しかし疑問は、なぜエラーが

   「ダイナミック リンク ライブラリ (DLL) 初期化ルーチンの実行に失敗しました

といった全く異なった内容になるかという問題です。

その理由は、tensorflowの標準形はAVX有りライブラリを使用しており、AVX無しの場合「標準ではないライブラリ」ということになり、これがインストールされていないために該当のDLLが無いというメッセージが出たのです。

ですから簡単にいうとAVX無し用の特殊ライブラリを手動でインストールすれば動くようになりるはずです。

但し、具体的に手動でどうやってインストールするのかが不明なのと、そのモジュールとtensorflowのバージョンの関係がはっきりしないので現在簡単にインストールすることができません。仮にインストールしても既にtensorflowのバージョンもV2.2.xまで行ってしまっているので、常に該当のモジュールを探さないといけなくなり面倒です。

そこで、一番良いのはLEVONO 310SはバージョンをAVX無し当時のものに固定するという案です。
つまり、具体的にはtensorflowのバージョンを「1.5.0」にダウングレードする方法です。

今回はアップグレード方式で変更します。

pip install --upgrade tensorflow==1.5.0


【重要なポイント】

そうすると、つまりtensorflowとKerasを用いたディープラーニングが少なくとも廉価版や古いCPUの場合は、いくらメモリーやGPUを持っていてもKerasが使用できる機能は限定されてしまうことになりますので、パソコン購入時はご注意下さい。

そしてGGEもLEVONOを使用する場合、

テキスト「ゼロから」のサンプルを動かす分には何の支障もありませんが、Kerasを使用すると動かなくなるため、仕様バージョンを下記に限定します。


    仮想環境 py35    python 3.5    tensorflow 1.5.0
    仮想環境 py36    python 3.6    tensorflow 1.5.0



【結 果】

ダウングレードにより動作することが確認されました。

教訓としてディープラーニングを勉強する上にPC選択は重要だということ分かりました。

    1. GPUはNVIDIA製 CUDAアーキテクチャ仕様

    2. CPUはCore-i2以前は、tensorflowのバージョン(1.5.0)で固定される

ということになります。


【参考文献】


≪清須電脳倶楽部メインページへ戻る場合はここをクリックしてください≫

Copyright(c)2018 GGE Kiyosu Cyber Club Allrights Reserved
inserted by FC2 system