Jetson NanoでStyleGAN2を試してみる

Last Updated: 2022/02/11 10:21:40

Images created by StyleGAN

昨日、Jetson Nano 上で StyleGAN を動かしてみたので、続けて StyleGAN2 を試してみます。

*JetPackやライブラリなどの環境構築については下記の記事と同じとなっておりますので、合わせて参考にしてみてください。

# nvccにパスを通す

まず、JetPackは4.6の時点でCUDA内のnvccというコマンドにパスが通っていないのでPATHを追加します。

# JetPack 4.6の時点ではnvccコマンドにパスが通っていないのでパスを通す必要がある。

# 念のため、nvccにパスが通っているか確認する
# もし、パスが通っていれば何もしなくてよい
$ which nvcc

# もしnvccが見つからない場合、nvccのある/usr/local/cuda/binにパスを通す
$ echo 'export PATH=${PATH}:/usr/local/cuda/bin' >> ~/.bashrc
$ export PATH=${PATH}:/usr/local/cuda/bin
1
2
3
4
5
6
7
8
9

パスを通したら、GitHubからStyleGAN2をクローンします。

README.md のRequirementsに記載されていますが、StyleGAN2ではnvccコマンドを利用しますので、正常に動作しているかどうかを下記のコマンドで確認します。

$ cd ~
$ git clone https://github.com/NVlabs/stylegan2
$ cd stylegan2

# stylegan2のREADME.mdに記載されているが、まずはNVCCが正常に動作しているか下記でチェックする
# 
# 下記のように表示されれば正常です。
# 
# CPU says hello.
# GPU says hello.

$ nvcc test_nvcc.cu -o test_nvcc -run
1
2
3
4
5
6
7
8
9
10
11
12

# 画像生成コマンドの実行

あとはREADME.md に記載されている通りに画像生成のコマンドを実行していきます。

# まずはREADME.md に記載されているとおりの方法で学習済みモデルから画像生成できるか確認
# ただし、JetPackのpythonはpython2なので、別途インストールしたpython3を使う。
python3 run_generator.py generate-images --network=gdrive:networks/stylegan2-ffhq-config-f.pkl --seeds=6600-6625 --truncation-psi=0.5
1
2
3

ここで下記のようなエラーが発生して失敗 😦

tensorflow.python.framework.errors_impl.NotFoundError: /home/kaz/stylegan2/dnnlib/tflib/_cudacache/fused_bias_act_601777699de14239ee94003371c74f59.so: undefined symbol: _ZN10tensorflow12OpDefBuilder5InputESs
1

こちらについて調べてみたところ、TensorFlowのバージョン問題のようでしたが、色々試しても全然解決しませんでした。
ちなみにTensorFlowのバージョンは1.15です。

$ python3 -c 'import tensorflow as tf; print(tf.__version__)' 
# 1.15.*
1
2

結局のところ、ここ (opens new window)で見つけた内容を元に、dnnlib/tflib/custom_ops.py で生成されているgccのコンパイラオプションを下記のように修正して解決しました。
(実のところ、本当にこれで大丈夫なのかはあまりよくわかっていません、、、)

--- dnnlib/tflib/custom_ops.py.bk	2022-02-02 09:49:37.683383645 +0900
+++ dnnlib/tflib/custom_ops.py	2022-02-02 10:40:29.145091681 +0900
@@ -124,7 +124,7 @@
             compile_opts += '"%s"' % os.path.join(tf.sysconfig.get_lib(), 'python', '_pywrap_tensorflow_internal.lib')
         elif os.name == 'posix':
             compile_opts += '"%s"' % os.path.join(tf.sysconfig.get_lib(), 'python', '_pywrap_tensorflow_internal.so')
-            compile_opts += ' --compiler-options \'-fPIC -D_GLIBCXX_USE_CXX11_ABI=0\''
+            compile_opts += ' --compiler-options \'-fPIC -D_GLIBCXX_USE_CXX11_ABI=1\''
         else:
             assert False # not Windows or Linux, w00t?
         compile_opts += ' --gpu-architecture=%s' % _get_cuda_gpu_arch_string()
1
2
3
4
5
6
7
8
9
10
11

これで再度試してみたところ、今度はメモリ不足で止まってしまいました。
StyleGANの時と同様、TensorFlowがメモリを目一杯使わないように制限して再度、実行します。(追記してkillされたらコメントアウト)

import tensorflow as tf
 
gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.7)
sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))
config = tf.ConfigProto()
config.gpu_options.allow_growth=True
sess = tf.Session(config=config)
1
2
3
4
5
6
7

再度試してみたところ、resultsフォルダ以下に画像が生成されていました。

python3 run_generator.py generate-images --network=gdrive:networks/stylegan2-ffhq-config-f.pkl --seeds=6600-6625 --truncation-psi=0.5
1

Images created by StyleGAN

# 他のコマンドも試してみる

他にも学習済みのモデルから画像生成するサンプルは全部で4つあります。


下記が2つ目。

python3 run_generator.py generate-images --network=gdrive:networks/stylegan2-ffhq-config-f.pkl  --seeds=66,230,389,1518 --truncation-psi=1.0
1

Images created by StyleGAN


3つ目は人の顔ではなく車の画像です。

python3 run_generator.py generate-images --network=gdrive:networks/stylegan2-car-config-f.pkl  --seeds=6000-6025 --truncation-psi=0.5
1

Images created by StyleGAN


最後はStyle-mixingでの画像生成のサンプルとなりますが、Jetson Nanoでは厳しいのか、10時間以上かかって結局、落ちてしまいました 😦

Last Updated: 2022/02/11 10:21:40
Copyright © Web Ninja All Rights Reserved.