20210505のTensorFlowに関する記事は6件です。

超解像手法/FSRCNNの実装

概要 深層学習を用いた、単一画像における超解像手法であるFSRCNNの実装したので、それのまとめの記事です。 Python + Tensorflow(Keras)で実装を行いました。 今回紹介するコードはGithubにも載せています。 1. 超解像のおさらい 超解像について簡単に説明をします。 超解像とは解像度の低い画像に対して、解像度を向上させる技術のことです。 ここでいう解像度が低いとは、画素数が少なかったり、高周波成分(輪郭などの鮮鋭な部分を表す)がないような画像のことです。 以下の図で例を示します。(図は[論文]より引用) これは、超解像の説明をする時によく使われる画像です。 (a)は原画像、(b)は画素数の少ない画像を見やすいように原画像と同じ大きさにした画像、(c)は高周波成分を含まない画像の例です。 (b)と(c)は、荒かったりぼやけていたりしていると思います。 このような状態を解像度が低い画像といいます。 そして、超解像はこのような解像度が低い画像に処理を行い、(a)のような精細な画像を出力することを目的としています。 2. 論文の超解像アルゴリズム 超解像のアルゴリズムの概要図は以下の通りです。(図は論文から引用) 上の図がSRCNN、下の図がFSRCNNのモデルの概要図となっています。 SRCNNでは、最初にBicubic法で画像を補間してからニューラルネットワークに入力しており、画像サイズが大きい状態で特徴抽出や返還を行っていました。 そのため、CNNのサイズが大きくなったり、計算が非効率になっているという問題がありました。 そこで、FSRCNNではSRCNNの大まかなモデルの構造はそのままに、 Feature extraction Shrinking Mapping Expanding Deconvolution のいくつかの層に分けることで、各層のCNNのサイズを小さくすることに成功しました。 また、LR画像から直接ピクセルの特徴抽出・変換を行うことで、で効率良い演算ができるようにしているのも特徴です。 3. 実装したアルゴリズム 今回、実装したFSRCNNの構造のコマンドラインは以下の通りです。 _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= input_1 (InputLayer) [(None, None, None, 1)] 0 _________________________________________________________________ conv2d (Conv2D) (None, None, None, 56) 1512 _________________________________________________________________ conv2d_1 (Conv2D) (None, None, None, 16) 928 _________________________________________________________________ conv2d_2 (Conv2D) (None, None, None, 16) 2336 _________________________________________________________________ conv2d_3 (Conv2D) (None, None, None, 16) 2336 _________________________________________________________________ conv2d_4 (Conv2D) (None, None, None, 16) 2336 _________________________________________________________________ conv2d_5 (Conv2D) (None, None, None, 16) 2336 _________________________________________________________________ conv2d_6 (Conv2D) (None, None, None, 56) 1008 _________________________________________________________________ conv2d_transpose (Conv2DTran (None, None, None, 1) 4537 ================================================================= Total params: 17,329 Trainable params: 17,329 Non-trainable params: 0 _________________________________________________________________ なお、mappingの回数は4回でモデルを制作しています。 活性化関数はPReLUを使用しました。 KerasのClass PReLUの状態だと、Input_shape = (None, None, 1)の任意の自然数に対応していないので、今回は独自のClass PReLUを作成しました。 コードは以下の通りです。 model.py class MyPReLU(Layer): #PReLUを独自に作成 def __init__(self, alpha_initializer = 'zeros', alpha_regularizer = None, alpha_constraint = None, shared_axes = None, **kwargs): super(MyPReLU, self).__init__(**kwargs) self.alpha_initializer = initializers.get('zeros') self.alpha_regularizer = regularizers.get(None) self.alpha_constraint = constraints.get(None) def build(self, input_shape): param_shape = tuple(1 for i in range(len(input_shape) - 1)) + input_shape[-1:] self.alpha = self.add_weight(shape = param_shape, name = 'alpha', initializer = self.alpha_initializer, regularizer = self.alpha_regularizer, constraint = self.alpha_constraint) self.built = True def call(self, inputs, mask=None): pos = K.relu(inputs) neg = -self.alpha * K.relu(-inputs) return pos + neg def compute_output_shape(self, input_shape): return input_shape def get_config(self): config = { 'alpha_initializer': initializers.serialize(self.alpha_initializer), 'alpha_regularizer': regularizers.serialize(self.alpha_regularizer), 'alpha_constraint': constraints.serialize(self.alpha_constraint), } base_config = super(MyPReLU, self).get_config() return dict(list(base_config.items()) + list(config.items())) stack over flowの質問を参考に、Kerasのドキュメントを変更して作成しました。 4. 使用したデータセット 今回は、データセットにDIV2K datasetを使用しました。 このデータセットは、単一画像のデータセットで、学習用が800種、検証用とテスト用が100種類ずつのデータセットです。 今回は、学習用データと検証用データを使用しました。 パスの構造はこんな感じです。 train_sharp - 0001.png - 0002.png - ... - 0800.png val_sharp - 0801.png - 0802.png - ... - 0900.png このデータをBicubicで縮小したりしてデータセットを生成しました。 5. 画像評価指標PSNR 今回は、画像評価指標としてPSNRを使用しました。 PSNR とは Peak Signal-to-Noise Ratio(ピーク信号対雑音比) の略で、単位はデジベル (dB) で表せます。 PSNR は信号の理論ピーク値と誤差の2乗平均を用いて評価しており、8bit画像の場合、255(最大濃淡値)を誤差の標準偏差で割った値です。 今回は、8bit画像を使用しましたが、計算量を減らすため、全画素値を255で割って使用しました。 そのため、最小濃淡値が0で最大濃淡値が1です。 dB値が高いほど拡大した画像が元画像に近いことを表します。 PSNRの式は以下のとおりです。 PSNR = 10\log_{10} \frac{1^2 * w * h}{\sum_{x=0}^{w-1}\sum_{y=0}^{h-1}(p_1(x,y) - p_2(x,y))^2 } なお、$w$は画像の幅、$h$は画像の高さを表しており、$p_1$は元画像、$p_2$はPSNRを計測する画像を示しています。 6. コードの使用方法 このコード使用方法は、自分が執筆した別の実装記事とほとんど同じです。 ① 学習データ生成 まず、Githubからコードを一式ダウンロードして、カレントディレクトリにします。 Windowsのコマンドでいうとこんな感じ。 C:~/keras_FSRCNN> 次に、main.pyから生成するデータセットのサイズ・大きさ・切り取る枚数、ファイルのパスなどを指定します。 main.pyの15~26行目です。 使うPCのメモリ数などに応じで、画像サイズや学習データ数の調整が必要です。 main.py train_height = 120 #HRのサイズ train_width = 120 test_height = 720 #HRのサイズ test_width = 1280 train_dataset_num = 10000 #生成する学習データの数 test_dataset_num = 10 #生成するテストデータの数 train_cut_num = 10 #一組の動画から生成するデータの数 test_cut_num = 1 train_path = "../../dataset/DIV2K_train_HR" #画像が入っているパス test_path = "../../dataset/DIV2K_valid_HR" 指定したら、コマンドでデータセットの生成をします。 C:~/keras_FSRCNN>python main.py --mode train_datacreate これで、train_data_list.npzというファイルのデータセットが生成されます。 ついでにテストデータも同じようにコマンドで生成します。コマンドはこれです。 C:~/keras_FSRCNN>python main.py --mode test_datacreate ② 学習 次に学習を行います。 設定するパラメータの箇所は、epoch数と学習率とかですかね... まずは、main.pyの28~31行目 main.py mag = 4 #拡大倍率 BATSH_SIZE = 32 EPOCHS = 1000 後は、学習のパラメータをあれこれ好きな値に設定します。81~94行目です。 なお、今回のFSRCNNではこちらが設定するパラメータがいくつかあります。 model.pyには書いているのですが、こちらにも記載しておきます。 まずは、FSRCNNのパラメータはこのようになっています。 model.py def FSRCNN(d, s, m, mag): """ d : The LR feature dimension s : The number of shrinking filters m : The mapping depth mag : Magnification """ main.pyのパラメータ設定はこのようになっています。 main.py train_model = model.FSRCNN(56, 16, 4, mag) optimizers = tf.keras.optimizers.Adam(learning_rate=1e-4) train_model.compile(loss = "mean_squared_error", optimizer = optimizers, metrics = [psnr]) train_model.fit(train_x, train_y, epochs = EPOCHS, verbose = 2, batch_size = BATSH_SIZE) train_model.save("FSRCNN_model.h5") optimizerはAdam、損失関数は平均二乗誤差を使用しています。 学習はデータ生成と同じようにコマンドで行います。 C:~/keras_FSRCNN>python main.py --mode train_model これで、学習が終わるとモデルが出力されます。 ③ 評価 最後にモデルを使用してテストデータで評価を行います。 これも同様にコマンドで行いますが、事前に①でテストデータも生成しておいてください。 C:~/keras_FSRCNN>python main.py --mode evaluate このコマンドで、画像を出力してくれます。 7. 結果 出力した画像はこのようになりました。 なお、今回は輝度値のみで学習を行っているため、カラー画像には対応していません。 対応させる場合は、modelのInputのchannel数を変えたり、データセット生成のchannel数を変える必要があります。 元画像 低解像度画像(4倍縮小) 生成画像 PSNR:25.15 分かりにくいので、低解像度画像を拡大にして生成画像と同じサイズにしたものも載せておきます。 低解像度画像(生成画像と同じサイズに拡大) 低解像度画像に比べると生成画像の粗さが取れていることがわかります。 最後に元画像・低解像度画像・生成画像の一部を並べて表示してみます。 並べて比べてみると、補間よりは高解像度化がされているのが分かります・ 流石に4倍だとなかなかうまくいかないのが現実です。 ついでに、大失敗した例も載せておきます。 低解像度生成の状態から既に線が分離しており、上手く高解像度化ができていません。 このことからも分かるように、超解像に適した画像とそうでない画像があります。 8. コードの全容 前述の通り、Githubに載せています。 pythonのファイルは主に3つあります。 各ファイルの役割は以下の通りです。 data_create.py : データ生成に関するコード。 model.py : 超解像のアルゴリズムに関するコード。 main.py : 主に使用するコード。 9. まとめ 今回は、最近読んだ論文のFSRCNNを元に実装してみました。 FSRCNNは、拡大処理もニューラルネットワークの中に入っているのが特徴です。 超解像の失敗例も一緒に載せれたのでよかったです。 記事が長くなってしまいましたが、最後まで読んでくださりありがとうございました。 参考文献 ・Accelerating the Super-Resolution Convolutional Neural Network  今回実装の参考にした論文。 ・画素数の壁を打ち破る 複数画像からの超解像技術  超解像の説明のために使用。 ・DIV2K dataset  今回使用したデータセット。 ・Keras advanced_activations.py  KerasのPReLUが記載されている元コード。今回はこれをコピーして変更した。 ・stack overflowの質問  PReLUに関する質問。PReLUを採用しているモデルの入力次元数が指定されていない場合の対処法を記している。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

DeepLearningを用いた超解像手法/FSRCNNの実装

概要 深層学習を用いた、単一画像における超解像手法であるFSRCNNの実装したので、それのまとめの記事です。 Python + Tensorflow(Keras)で実装を行いました。 今回紹介するコードはGithubにも載せています。 1. 超解像のおさらい 超解像について簡単に説明をします。 超解像とは解像度の低い画像に対して、解像度を向上させる技術のことです。 ここでいう解像度が低いとは、画素数が少なかったり、高周波成分(輪郭などの鮮鋭な部分を表す)がないような画像のことです。 以下の図で例を示します。(図は[論文]より引用) これは、超解像の説明をする時によく使われる画像です。 (a)は原画像、(b)は画素数の少ない画像を見やすいように原画像と同じ大きさにした画像、(c)は高周波成分を含まない画像の例です。 (b)と(c)は、荒かったりぼやけていたりしていると思います。 このような状態を解像度が低い画像といいます。 そして、超解像はこのような解像度が低い画像に処理を行い、(a)のような精細な画像を出力することを目的としています。 2. 論文の超解像アルゴリズム 超解像のアルゴリズムの概要図は以下の通りです。(図は論文から引用) 上の図がSRCNN、下の図がFSRCNNのモデルの概要図となっています。 SRCNNでは、最初にBicubic法で画像を補間してからニューラルネットワークに入力しており、画像サイズが大きい状態で特徴抽出や返還を行っていました。 そのため、CNNのサイズが大きくなったり、計算が非効率になっているという問題がありました。 そこで、FSRCNNではSRCNNの大まかなモデルの構造はそのままに、 Feature extraction Shrinking Mapping Expanding Deconvolution のいくつかの層に分けることで、各層のCNNのサイズを小さくすることに成功しました。 また、LR画像から直接ピクセルの特徴抽出・変換を行うことで、で効率良い演算ができるようにしているのも特徴です。 3. 実装したアルゴリズム 今回、実装したFSRCNNの構造のコマンドラインは以下の通りです。 _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= input_1 (InputLayer) [(None, None, None, 1)] 0 _________________________________________________________________ conv2d (Conv2D) (None, None, None, 56) 1512 _________________________________________________________________ conv2d_1 (Conv2D) (None, None, None, 16) 928 _________________________________________________________________ conv2d_2 (Conv2D) (None, None, None, 16) 2336 _________________________________________________________________ conv2d_3 (Conv2D) (None, None, None, 16) 2336 _________________________________________________________________ conv2d_4 (Conv2D) (None, None, None, 16) 2336 _________________________________________________________________ conv2d_5 (Conv2D) (None, None, None, 16) 2336 _________________________________________________________________ conv2d_6 (Conv2D) (None, None, None, 56) 1008 _________________________________________________________________ conv2d_transpose (Conv2DTran (None, None, None, 1) 4537 ================================================================= Total params: 17,329 Trainable params: 17,329 Non-trainable params: 0 _________________________________________________________________ なお、mappingの回数は4回でモデルを制作しています。 活性化関数はPReLUを使用しました。 KerasのClass PReLUの状態だと、Input_shape = (None, None, 1)の任意の自然数に対応していないので、今回は独自のClass PReLUを作成しました。 コードは以下の通りです。 model.py class MyPReLU(Layer): #PReLUを独自に作成 def __init__(self, alpha_initializer = 'zeros', alpha_regularizer = None, alpha_constraint = None, shared_axes = None, **kwargs): super(MyPReLU, self).__init__(**kwargs) self.alpha_initializer = initializers.get('zeros') self.alpha_regularizer = regularizers.get(None) self.alpha_constraint = constraints.get(None) def build(self, input_shape): param_shape = tuple(1 for i in range(len(input_shape) - 1)) + input_shape[-1:] self.alpha = self.add_weight(shape = param_shape, name = 'alpha', initializer = self.alpha_initializer, regularizer = self.alpha_regularizer, constraint = self.alpha_constraint) self.built = True def call(self, inputs, mask=None): pos = K.relu(inputs) neg = -self.alpha * K.relu(-inputs) return pos + neg def compute_output_shape(self, input_shape): return input_shape def get_config(self): config = { 'alpha_initializer': initializers.serialize(self.alpha_initializer), 'alpha_regularizer': regularizers.serialize(self.alpha_regularizer), 'alpha_constraint': constraints.serialize(self.alpha_constraint), } base_config = super(MyPReLU, self).get_config() return dict(list(base_config.items()) + list(config.items())) stack over flowの質問を参考に、Kerasのドキュメントを変更して作成しました。 4. 使用したデータセット 今回は、データセットにDIV2K datasetを使用しました。 このデータセットは、単一画像のデータセットで、学習用が800種、検証用とテスト用が100種類ずつのデータセットです。 今回は、学習用データと検証用データを使用しました。 パスの構造はこんな感じです。 train_sharp - 0001.png - 0002.png - ... - 0800.png val_sharp - 0801.png - 0802.png - ... - 0900.png このデータをBicubicで縮小したりしてデータセットを生成しました。 5. 画像評価指標PSNR 今回は、画像評価指標としてPSNRを使用しました。 PSNR とは Peak Signal-to-Noise Ratio(ピーク信号対雑音比) の略で、単位はデジベル (dB) で表せます。 PSNR は信号の理論ピーク値と誤差の2乗平均を用いて評価しており、8bit画像の場合、255(最大濃淡値)を誤差の標準偏差で割った値です。 今回は、8bit画像を使用しましたが、計算量を減らすため、全画素値を255で割って使用しました。 そのため、最小濃淡値が0で最大濃淡値が1です。 dB値が高いほど拡大した画像が元画像に近いことを表します。 PSNRの式は以下のとおりです。 PSNR = 10\log_{10} \frac{1^2 * w * h}{\sum_{x=0}^{w-1}\sum_{y=0}^{h-1}(p_1(x,y) - p_2(x,y))^2 } なお、$w$は画像の幅、$h$は画像の高さを表しており、$p_1$は元画像、$p_2$はPSNRを計測する画像を示しています。 6. コードの使用方法 このコード使用方法は、自分が執筆した別の実装記事とほとんど同じです。 ① 学習データ生成 まず、Githubからコードを一式ダウンロードして、カレントディレクトリにします。 Windowsのコマンドでいうとこんな感じ。 C:~/keras_FSRCNN> 次に、main.pyから生成するデータセットのサイズ・大きさ・切り取る枚数、ファイルのパスなどを指定します。 main.pyの15~26行目です。 使うPCのメモリ数などに応じで、画像サイズや学習データ数の調整が必要です。 main.py train_height = 120 #HRのサイズ train_width = 120 test_height = 720 #HRのサイズ test_width = 1280 train_dataset_num = 10000 #生成する学習データの数 test_dataset_num = 10 #生成するテストデータの数 train_cut_num = 10 #一組の動画から生成するデータの数 test_cut_num = 1 train_path = "../../dataset/DIV2K_train_HR" #画像が入っているパス test_path = "../../dataset/DIV2K_valid_HR" 指定したら、コマンドでデータセットの生成をします。 C:~/keras_FSRCNN>python main.py --mode train_datacreate これで、train_data_list.npzというファイルのデータセットが生成されます。 ついでにテストデータも同じようにコマンドで生成します。コマンドはこれです。 C:~/keras_FSRCNN>python main.py --mode test_datacreate ② 学習 次に学習を行います。 設定するパラメータの箇所は、epoch数と学習率とかですかね... まずは、main.pyの28~31行目 main.py mag = 4 #拡大倍率 BATSH_SIZE = 32 EPOCHS = 1000 後は、学習のパラメータをあれこれ好きな値に設定します。81~94行目です。 なお、今回のFSRCNNではこちらが設定するパラメータがいくつかあります。 model.pyには書いているのですが、こちらにも記載しておきます。 まずは、FSRCNNのパラメータはこのようになっています。 model.py def FSRCNN(d, s, m, mag): """ d : The LR feature dimension s : The number of shrinking filters m : The mapping depth mag : Magnification """ main.pyのパラメータ設定はこのようになっています。 main.py train_model = model.FSRCNN(56, 16, 4, mag) optimizers = tf.keras.optimizers.Adam(learning_rate=1e-4) train_model.compile(loss = "mean_squared_error", optimizer = optimizers, metrics = [psnr]) train_model.fit(train_x, train_y, epochs = EPOCHS, verbose = 2, batch_size = BATSH_SIZE) train_model.save("FSRCNN_model.h5") optimizerはAdam、損失関数は平均二乗誤差を使用しています。 学習はデータ生成と同じようにコマンドで行います。 C:~/keras_FSRCNN>python main.py --mode train_model これで、学習が終わるとモデルが出力されます。 ③ 評価 最後にモデルを使用してテストデータで評価を行います。 これも同様にコマンドで行いますが、事前に①でテストデータも生成しておいてください。 C:~/keras_FSRCNN>python main.py --mode evaluate このコマンドで、画像を出力してくれます。 7. 結果 出力した画像はこのようになりました。 なお、今回は輝度値のみで学習を行っているため、カラー画像には対応していません。 対応させる場合は、modelのInputのchannel数を変えたり、データセット生成のchannel数を変える必要があります。 元画像 低解像度画像(4倍縮小) 生成画像 PSNR:25.15 分かりにくいので、低解像度画像を拡大にして生成画像と同じサイズにしたものも載せておきます。 低解像度画像(生成画像と同じサイズに拡大) 低解像度画像に比べると生成画像の粗さが取れていることがわかります。 最後に元画像・低解像度画像・生成画像の一部を並べて表示してみます。 並べて比べてみると、補間よりは高解像度化がされているのが分かります・ 流石に4倍だとなかなかうまくいかないのが現実です。 ついでに、大失敗した例も載せておきます。 低解像度生成の状態から既に線が分離しており、上手く高解像度化ができていません。 このことからも分かるように、超解像に適した画像とそうでない画像があります。 8. コードの全容 前述の通り、Githubに載せています。 pythonのファイルは主に3つあります。 各ファイルの役割は以下の通りです。 data_create.py : データ生成に関するコード。 model.py : 超解像のアルゴリズムに関するコード。 main.py : 主に使用するコード。 9. まとめ 今回は、最近読んだ論文のFSRCNNを元に実装してみました。 FSRCNNは、拡大処理もニューラルネットワークの中に入っているのが特徴です。 超解像の失敗例も一緒に載せれたのでよかったです。 記事が長くなってしまいましたが、最後まで読んでくださりありがとうございました。 参考文献 ・Accelerating the Super-Resolution Convolutional Neural Network  今回実装の参考にした論文。 ・画素数の壁を打ち破る 複数画像からの超解像技術  超解像の説明のために使用。 ・DIV2K dataset  今回使用したデータセット。 ・Keras advanced_activations.py  KerasのPReLUが記載されている元コード。今回はこれをコピーして変更した。 ・stack overflowの質問  PReLUに関する質問。PReLUを採用しているモデルの入力次元数が指定されていない場合の対処法を記している。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

StyleGAN2:Google Colab 'undefined symbol' エラー

1.はじめに  Google colabでStyelegan2を使ったコードを久しぶりに動かそうとしたら、エラーが発生しました。コードを書いたのは2020.8で、その当時は問題なく動作したのに、急に動かなくなったわけです。解決に結構時間が掛かったのでメモとして残します。 2.エラーの内容  エラーは、モデルをコンパイルしてstylegan2の学習済みパラメータを読み込むときに発生します(下記ログ参照)。 ...... Loading networks from "gdrive:networks/stylegan2-ffhq-config-f.pkl"... Downloading https://nvlabs-fi-cdn.nvidia.com/stylegan2/networks/stylegan2-ffhq-config-f.pkl ... done Setting up TensorFlow plugin "fused_bias_act.cu": Preprocessing... Compiling... Loading... Failed! ......    最終的なエラーメッセージは、下記の様です。 tensorflow.python.framework.errors_impl.NotFoundError: /content/stylegan2/dnnlib/tflib/_cudacache/fused_bias_act_0f493ee56b0c2b4e01bd31e17dbfca83.so: undefined symbol: _ZN10tensorflow12OpDefBuilder5InputESs  何これ? fused_bias_act_0f493ee56b0c2b4e01bd31e17dbfca83.so がない? 未定義のシンボル:_ZN10tensorflow12OpDefBuilder5InputESs って何さ?   色々ググってみると Tensorflowとcudaのバージョンが合わない時に発生するようなことが書いてあったりしたので、色々いじってみましたが全然ダメでした。 3.解決策  問題は、TensorflowとKerasを指定バージョンでインストールしていたことでした(下記参照)。でも 2020.8時点は、これじゃないと上手く動かなかったんだけど。。。。 !pip install tensorflow==1.14 !pip install tensorflow-gpu==1.14 !pip install keras==2.0.8    これを、下記の様に変更したら、エラーが嘘の様に消えました。 %tensorflow_version 1.x  お悩みのことがもしいらっしゃれば、参考にどうぞ。     
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Jetson NanoのNode-REDでTensorFlowモデルを利用する際にGPUリソースを使用するメモ (※TensorFlow 1.x, JetPack 4.3)

はじめに Jetson Nano の Node-RED で TensorFlow モデルを試した際に GPU リソースを使用する手順をまとめておきます。(TensorFlow 1.x, JetPack 4.3) 環境 TensorFlow.js を Node.js で利用する場合、Jetson Nano の GPU リソースを使用するためには環境が重要です。 @tensorflow/tfjs-node の最新バージョン(2021年5月3日時点)は v1.7.4 TensorFlow v1.15.0 が指定されている TensorFlow shared libraries が必要だが、arm64 でビルドされたものを custom-binary.json で指定する必要がある arm64 でビルドされた TensorFlow shared libraries は CUDA 10.0 と cuDNN 7 ライブラリを使用している Jetson Nano の環境は JetPack 4.3 を使用する必要があります。 (最新の JetPack 4.5.1 を使用するとエラーが出て使用できませんでした。) リリース時期 JetPack CUDA cuDNN 対象 2019/12 4.3 10.0.326 7.6.3 o 2020/7 4.4 10.2.89 8.0.0 DP - 2020/7 4.4.1 10.2.89 8.0.0 DP - 2021/1 4.5 10.2.89 8.0.0.180 - 2021/2 4.5.1 10.2.89 8.0.0.180 - 手順 簡単に試したい場合は、後ろの手順(簡単に試す場合の手順)を参照してください。 1. Node-REDのインストール 以下のコマンドを実行して、Jetson Nano に Node-RED をインストールします。 $ bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered) 質問を聞かれた場合は、y を入力します。(2回) Are you really sure you want to do this ? [y/N] ? y Would you like to install the Pi-specific nodes ? [y/N] ? y 2. @tensorflow/tfjs-node のインストール TensorFlow.js を Node-RED(Node.js) で使用するために、@tensorflow/tfjs-node モジュールをインストールします。 $ cd ~/.node-red $ npm i @tensorflow/tfjs-node@1.7.4 エラーが表示されるので、以下の手順を実施します。 $ cd node_modules/@tensorflow/tfjs-node custom-binary.json ファイルを作成します。 $ vi scripts/custom-binary.json custom-binary.json { "tf-lib": "https://s3.us.cloud-object-storage.appdomain.cloud/tfjs-cos/libtensorflow-gpu-linux-arm64-1.15.0.tar.gz" } 再度インストールします。 $ npm i 3. node-red-contrib-tfjs-coco-ssd のインストール COCO モデルを使用した SSD によるオブジェクト検出を試すために、 node-red-contrib-tfjs-coco-ssd モジュールをインストールします。 node-red-contrib-tfjs-coco-ssd は 依存関係に @tensorflow/tfjs-node モジュールのバーション 1.4.0 が指定されているため、最新バージョン (1.7.4) へ変更する必要があります。 $ cd ~/.node-red $ npm i node-red-contrib-tfjs-coco-ssd エラーが表示されるので、以下の手順を実施します。 $ cd node_modules/node-red-contrib-tfjs-coco-ssd package.json の依存関係で、@tensorflow/tfjs-node に指定されているバージョンを 1.4.0 から 1.7.4 へ変更します。 package.json "@tensorflow/tfjs-node": "1.4.0", ↓ "@tensorflow/tfjs-node": "1.7.4", エラーが表示されるので、2. @tensorflow/tfjs-node のインストールと同様に、以下の手順を実施します。 $ cd node_modules/@tensorflow/tfjs-node custom-binary.json ファイルを作成します。 $ vi scripts/custom-binary.json custom-binary.json { "tf-lib": "https://s3.us.cloud-object-storage.appdomain.cloud/tfjs-cos/libtensorflow-gpu-linux-arm64-1.15.0.tar.gz" } 再度インストールします。 $ npm i package-lock.json を削除します。 (@tensorflow/tfjs-node モジュールのバーション 1.4.0 をインストールした情報が残っているため) $ cd ~/.node-red $ rm package-lock.json 4. Node-RED を起動します。 $ node-red-start Node-RED の起動ログが表示されますので、起動が完了したら Ctrl + C で抜けます。 停止する場合は、以下のコマンドを実行します。 $ node-red-stop 簡単に試す場合の手順 node-red-contrib-tfjs-coco-ssd モジュールを fork して導入手順を簡略化しています。 1. Node-REDのインストール 以下のコマンドを実行して、Jetson Nano に Node-RED をインストールします。 $ bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered) 質問を聞かれた場合は、y を入力します。(2回) Are you really sure you want to do this ? [y/N] ? y Would you like to install the Pi-specific nodes ? [y/N] ? y 2. @kitazaki/node-red-contrib-tfjs-coco-ssd のインストール $ cd ~/.node-red $ npm i @kitazaki/node-red-contrib-tfjs-coco-ssd@0.0.3 エラーが表示されるので、以下の手順を実施します。 (インストールの中で @tensorflow/tfjs-node の custom-binary.json を作成しているので、2回目のインストールで成功します) $ cd node_modules/@tensorflow/tfjs-node/ $ npm i 3. Node-RED を起動します。 $ node-red-start Node-RED の起動ログが表示されますので、起動が完了したら Ctrl + C で抜けます。 停止する場合は、以下のコマンドを実行します。 $ node-red-stop サンプルのフローを動かす USB カメラで撮影した画像を使用してオブジェクト検出し、結果を Node-RED のフロー上に表示するため、以下の2つのモジュールをインストールします。 node-red-contrib-image-output node-red-contrib-usbcamera node-red-contrib-usbcamera モジュールを使用するためには、fswebcam コマンドをインストールする必要があります。 $ sudo apt update $ sudo apt install fswebcam $ cd ~/.node-red $ npm i node-red-contrib-image-output $ npm i node-red-contrib-usbcamera モジュールをインストールした後は Node-RED の停止・起動を行います。 $ node-red-stop $ node-red-start サンプルのフローをインポートします。 flows.json [{"id":"7b70c5ee.6f8b54","type":"tab","label":"フロー 1","disabled":false,"info":""},{"id":"536b8b06.e08124","type":"tensorflowCoco","z":"7b70c5ee.6f8b54","name":"","modelUrl":"http://localhost:1880/coco/model.json","scoreThreshold":0.5,"passthru":"bbox","lineColour":"magenta","x":530,"y":340,"wires":[["322a680c.2a6458","91d145e.e45deb8"]]},{"id":"974b536b.811538","type":"image","z":"7b70c5ee.6f8b54","name":"","width":160,"data":"payload","dataType":"msg","thumbnail":false,"active":true,"pass":false,"outputs":0,"x":540,"y":160,"wires":[]},{"id":"6bc3a717.18fcd","type":"http request","z":"7b70c5ee.6f8b54","name":"","method":"GET","ret":"bin","paytoqs":"ignore","url":"https://upload.wikimedia.org/wikipedia/commons/b/b3/Team_Queerala.jpg","tls":"","persist":false,"proxy":"","authType":"","x":310,"y":280,"wires":[["974b536b.811538","536b8b06.e08124","8f34f7cf.94bfe8"]]},{"id":"71825deb.2c1e34","type":"inject","z":"7b70c5ee.6f8b54","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":120,"y":280,"wires":[["6bc3a717.18fcd"]]},{"id":"322a680c.2a6458","type":"debug","z":"7b70c5ee.6f8b54","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":710,"y":300,"wires":[]},{"id":"91d145e.e45deb8","type":"image","z":"7b70c5ee.6f8b54","name":"","width":"320","data":"image","dataType":"msg","thumbnail":false,"active":true,"pass":false,"outputs":0,"x":740,"y":340,"wires":[]},{"id":"8f34f7cf.94bfe8","type":"debug","z":"7b70c5ee.6f8b54","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":510,"y":100,"wires":[]},{"id":"20417db3.6bb88a","type":"usbcamera","z":"7b70c5ee.6f8b54","filemode":"0","filename":"image01.jpg","filedefpath":"1","filepath":"","fileformat":"jpeg","resolution":"2","name":"","x":310,"y":340,"wires":[["974b536b.811538","8f34f7cf.94bfe8","536b8b06.e08124"]]},{"id":"e39ca5b2.147f48","type":"inject","z":"7b70c5ee.6f8b54","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":120,"y":340,"wires":[["20417db3.6bb88a"]]}] サンプルのフローはGithubにも置いておきます。 動作確認 Node-RED を実行し、サンプルフローを読み込んだ後、以下のようなログが出力されれば正常です。 5 May 12:30:23 - [info] Starting flows 2021-05-05 12:30:24.866596: W tensorflow/core/platform/profile_utils/cpu_utils.cc:98] Failed to find bogomips in /proc/cpuinfo; cannot determine CPU frequency 2021-05-05 12:30:24.867601: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x7f3dbf7290 initialized for platform Host (this does not guarantee that XLA will be used). Devices: 2021-05-05 12:30:24.867990: I tensorflow/compiler/xla/service/service.cc:176] StreamExecutor device (0): Host, Default Version 2021-05-05 12:30:24.895666: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcuda.so.1 2021-05-05 12:30:24.916967: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:950] ARM64 does not support NUMA - returning NUMA node zero 2021-05-05 12:30:24.917130: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1618] Found device 0 with properties: name: NVIDIA Tegra X1 major: 5 minor: 3 memoryClockRate(GHz): 0.9216 pciBusID: 0000:00:00.0 2021-05-05 12:30:24.923907: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcudart.so.10.0 2021-05-05 12:30:24.937424: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcublas.so.10.0 2021-05-05 12:30:24.953026: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcufft.so.10.0 2021-05-05 12:30:24.958246: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcurand.so.10.0 2021-05-05 12:30:24.974519: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcusolver.so.10.0 2021-05-05 12:30:24.983350: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcusparse.so.10.0 2021-05-05 12:30:25.032299: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcudnn.so.7 2021-05-05 12:30:25.032490: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:950] ARM64 does not support NUMA - returning NUMA node zero 2021-05-05 12:30:25.032660: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:950] ARM64 does not support NUMA - returning NUMA node zero 2021-05-05 12:30:25.032749: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1746] Adding visible gpu devices: 0 2021-05-05 12:30:26.638460: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1159] Device interconnect StreamExecutor with strength 1 edge matrix: 2021-05-05 12:30:26.638579: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1165] 0 2021-05-05 12:30:26.638612: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1178] 0: N 2021-05-05 12:30:26.638878: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:950] ARM64 does not support NUMA - returning NUMA node zero 2021-05-05 12:30:26.639051: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:950] ARM64 does not support NUMA - returning NUMA node zero 2021-05-05 12:30:26.639201: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:950] ARM64 does not support NUMA - returning NUMA node zero 2021-05-05 12:30:26.639567: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1304] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 212 MB memory) -> physical GPU (device: 0, name: NVIDIA Tegra X1, pci bus id: 0000:00:00.0, compute capability: 5.3) 2021-05-05 12:30:26.648679: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x7eacbb15e0 initialized for platform CUDA (this does not guarantee that XLA will be used). Devices: 2021-05-05 12:30:26.648767: I tensorflow/compiler/xla/service/service.cc:176] StreamExecutor device (0): NVIDIA Tegra X1, Compute Capability 5.3 cpu backend was already registered. Reusing existing backend factory. Platform node has already been set. Overwriting the platform with [object Object]. 5 May 12:30:27 - [info] Started flows 2021-05-05 12:30:28.221079: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcudnn.so.7 2021-05-05 12:30:32.507124: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcublas.so.10.0 実際に GPU リソースが使用されているか確認する場合、jtop コマンドを実行するのが簡単です。 初回にインストールした場合、OSの再起動が必要です。既にインストールされている場合、最新の jtop コマンドがインストールされます。 以下の手順でインストールします。 $ sudo apt install python-pip $ sudo -H pip install -U jetson-stats # 初回の場合のみ $ sudo reboot 以下の手順で実行します。 $ jtop まとめ みなさま、良き Jetson Nano & Node-RED ライフを! @kitazaki/node-red-contrib-tfjs-coco-ssd モジュールの変更内容 1. package.json 変更 2. fixarm64.js 追加 3. custom-binary.json 追加 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Jetson NanoのNode-REDでTensorFlowモデルを利用する際にGPUリソースを使用するメモ

はじめに Jetson Nano の Node-RED で TensorFlow モデルを試した際に GPU リソースを使用する手順をまとめておきます。 環境 TensorFlow.js を Node.js で利用する場合、Jetson Nano の GPU リソースを使用するためには環境が重要です。 @tensorflow/tfjs-node の最新バージョン(2021年5月3日時点)は v1.7.4 TensorFlow v1.15.0 が指定されている TensorFlow shared libraries が必要だが、arm64 でビルドされたものを custom-binary.json で指定する必要がある arm64 でビルドされた TensorFlow shared libraries は CUDA 10.0 と cuDNN 7 ライブラリを使用している Jetson Nano の環境は JetPack 4.3 を使用する必要があります。 (最新の JetPack 4.5.1 を使用するとエラーが出て使用できませんでした。) リリース時期 JetPack CUDA cuDNN 2019/12 4.3 10.0.326 7.6.3 2020/7 4.4 10.2.89 8.0.0 DP 2020/7 4.4.1 10.2.89 8.0.0 DP 2021/1 4.5 10.2.89 8.0.0.180 2021/2 4.5.1 10.2.89 8.0.0.180 手順 簡単に試したい場合は、後ろの手順(簡単に試す場合の手順)を参照してください。 1. Node-REDのインストール 以下のコマンドを実行して、Jetson Nano に Node-RED をインストールします。 $ bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered) 質問を聞かれた場合は、y を入力します。(2回) Are you really sure you want to do this ? [y/N] ? y Would you like to install the Pi-specific nodes ? [y/N] ? y 2. @tensorflow/tfjs-node のインストール TensorFlow.js を Node-RED(Node.js) で使用するために、@tensorflow/tfjs-node モジュールをインストールします。 $ cd ~/.node-red $ npm i @tensorflow/tfjs-node@1.7.4 エラーが表示されるので、以下の手順を実施します。 $ cd node_modules/@tensorflow/tfjs-node custom-binary.json ファイルを作成します。 $ vi scripts/custom-binary.json custom-binary.json { "tf-lib": "https://s3.us.cloud-object-storage.appdomain.cloud/tfjs-cos/libtensorflow-gpu-linux-arm64-1.15.0.tar.gz" } 再度インストールします。 $ npm i 3. node-red-contrib-tfjs-coco-ssd のインストール COCO モデルを使用した SSD によるオブジェクト検出を試すために、 node-red-contrib-tfjs-coco-ssd モジュールをインストールします。 node-red-contrib-tfjs-coco-ssd は 依存関係に @tensorflow/tfjs-node モジュールのバーション 1.4.0 が指定されているため、最新バージョン (1.7.4) へ変更する必要があります。 $ cd ~/.node-red $ npm i node-red-contrib-tfjs-coco-ssd エラーが表示されるので、以下の手順を実施します。 $ cd node_modules/node-red-contrib-tfjs-coco-ssd package.json の依存関係で、@tensorflow/tfjs-node に指定されているバージョンを 1.4.0 から 1.7.4 へ変更します。 package.json "@tensorflow/tfjs-node": "1.4.0", ↓ "@tensorflow/tfjs-node": "1.7.4", エラーが表示されるので、2. @tensorflow/tfjs-node のインストールと同様に、以下の手順を実施します。 $ cd node_modules/@tensorflow/tfjs-node custom-binary.json ファイルを作成します。 $ vi scripts/custom-binary.json custom-binary.json { "tf-lib": "https://s3.us.cloud-object-storage.appdomain.cloud/tfjs-cos/libtensorflow-gpu-linux-arm64-1.15.0.tar.gz" } 再度インストールします。 $ npm i package-lock.json を削除します。 (@tensorflow/tfjs-node モジュールのバーション 1.4.0 をインストールした情報が残っているため) $ cd ~/.node-red $ rm package-lock.json 4. Node-RED を起動します。 $ node-red-start Node-RED の起動ログが表示されますので、起動が完了したら Ctrl + C で抜けます。 停止する場合は、以下のコマンドを実行します。 $ node-red-stop 簡単に試す場合の手順 node-red-contrib-tfjs-coco-ssd モジュールを fork して導入手順を簡略化しています。 1. Node-REDのインストール 以下のコマンドを実行して、Jetson Nano に Node-RED をインストールします。 $ bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered) 質問を聞かれた場合は、y を入力します。(2回) Are you really sure you want to do this ? [y/N] ? y Would you like to install the Pi-specific nodes ? [y/N] ? y 2. @kitazaki/node-red-contrib-tfjs-coco-ssd のインストール $ cd ~/.node-red $ npm i @kitazaki/node-red-contrib-tfjs-coco-ssd エラーが表示されるので、以下の手順を実施します。 (インストールの中で @tensorflow/tfjs-node の custom-binary.json を作成しているので、2回目のインストールで成功します) $ cd node_modules/@tensorflow/tfjs-node/ $ npm i 3. Node-RED を起動します。 $ node-red-start Node-RED の起動ログが表示されますので、起動が完了したら Ctrl + C で抜けます。 停止する場合は、以下のコマンドを実行します。 $ node-red-stop サンプルのフローを動かす USB カメラで撮影した画像を使用してオブジェクト検出し、結果を Node-RED のフロー上に表示するため、以下の2つのモジュールをインストールします。 node-red-contrib-image-output node-red-contrib-usbcamera node-red-contrib-usbcamera モジュールを使用するためには、fswebcam コマンドをインストールする必要があります。 $ sudo apt update $ sudo apt install fswebcam $ cd ~/.node-red $ npm i node-red-contrib-image-output $ npm i node-red-contrib-usbcamera モジュールをインストールした後は Node-RED の停止・起動を行います。 $ node-red-stop $ node-red-start サンプルのフローをインポートします。 flows.json [{"id":"7b70c5ee.6f8b54","type":"tab","label":"フロー 1","disabled":false,"info":""},{"id":"536b8b06.e08124","type":"tensorflowCoco","z":"7b70c5ee.6f8b54","name":"","modelUrl":"http://localhost:1880/coco/model.json","scoreThreshold":0.5,"passthru":"bbox","lineColour":"magenta","x":530,"y":340,"wires":[["322a680c.2a6458","91d145e.e45deb8"]]},{"id":"974b536b.811538","type":"image","z":"7b70c5ee.6f8b54","name":"","width":160,"data":"payload","dataType":"msg","thumbnail":false,"active":true,"pass":false,"outputs":0,"x":540,"y":160,"wires":[]},{"id":"6bc3a717.18fcd","type":"http request","z":"7b70c5ee.6f8b54","name":"","method":"GET","ret":"bin","paytoqs":"ignore","url":"https://upload.wikimedia.org/wikipedia/commons/b/b3/Team_Queerala.jpg","tls":"","persist":false,"proxy":"","authType":"","x":310,"y":280,"wires":[["974b536b.811538","536b8b06.e08124","8f34f7cf.94bfe8"]]},{"id":"71825deb.2c1e34","type":"inject","z":"7b70c5ee.6f8b54","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":120,"y":280,"wires":[["6bc3a717.18fcd"]]},{"id":"322a680c.2a6458","type":"debug","z":"7b70c5ee.6f8b54","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":710,"y":300,"wires":[]},{"id":"91d145e.e45deb8","type":"image","z":"7b70c5ee.6f8b54","name":"","width":"320","data":"image","dataType":"msg","thumbnail":false,"active":true,"pass":false,"outputs":0,"x":740,"y":340,"wires":[]},{"id":"8f34f7cf.94bfe8","type":"debug","z":"7b70c5ee.6f8b54","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":510,"y":100,"wires":[]},{"id":"20417db3.6bb88a","type":"usbcamera","z":"7b70c5ee.6f8b54","filemode":"0","filename":"image01.jpg","filedefpath":"1","filepath":"","fileformat":"jpeg","resolution":"2","name":"","x":310,"y":340,"wires":[["974b536b.811538","8f34f7cf.94bfe8","536b8b06.e08124"]]},{"id":"e39ca5b2.147f48","type":"inject","z":"7b70c5ee.6f8b54","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":120,"y":340,"wires":[["20417db3.6bb88a"]]}] サンプルのフローはGithubにも置いておきます。 動作確認 Node-RED を実行し、サンプルフローを読み込んだ後、以下のようなログが出力されれば正常です。 5 May 12:30:23 - [info] Starting flows 2021-05-05 12:30:24.866596: W tensorflow/core/platform/profile_utils/cpu_utils.cc:98] Failed to find bogomips in /proc/cpuinfo; cannot determine CPU frequency 2021-05-05 12:30:24.867601: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x7f3dbf7290 initialized for platform Host (this does not guarantee that XLA will be used). Devices: 2021-05-05 12:30:24.867990: I tensorflow/compiler/xla/service/service.cc:176] StreamExecutor device (0): Host, Default Version 2021-05-05 12:30:24.895666: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcuda.so.1 2021-05-05 12:30:24.916967: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:950] ARM64 does not support NUMA - returning NUMA node zero 2021-05-05 12:30:24.917130: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1618] Found device 0 with properties: name: NVIDIA Tegra X1 major: 5 minor: 3 memoryClockRate(GHz): 0.9216 pciBusID: 0000:00:00.0 2021-05-05 12:30:24.923907: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcudart.so.10.0 2021-05-05 12:30:24.937424: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcublas.so.10.0 2021-05-05 12:30:24.953026: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcufft.so.10.0 2021-05-05 12:30:24.958246: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcurand.so.10.0 2021-05-05 12:30:24.974519: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcusolver.so.10.0 2021-05-05 12:30:24.983350: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcusparse.so.10.0 2021-05-05 12:30:25.032299: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcudnn.so.7 2021-05-05 12:30:25.032490: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:950] ARM64 does not support NUMA - returning NUMA node zero 2021-05-05 12:30:25.032660: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:950] ARM64 does not support NUMA - returning NUMA node zero 2021-05-05 12:30:25.032749: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1746] Adding visible gpu devices: 0 2021-05-05 12:30:26.638460: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1159] Device interconnect StreamExecutor with strength 1 edge matrix: 2021-05-05 12:30:26.638579: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1165] 0 2021-05-05 12:30:26.638612: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1178] 0: N 2021-05-05 12:30:26.638878: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:950] ARM64 does not support NUMA - returning NUMA node zero 2021-05-05 12:30:26.639051: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:950] ARM64 does not support NUMA - returning NUMA node zero 2021-05-05 12:30:26.639201: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:950] ARM64 does not support NUMA - returning NUMA node zero 2021-05-05 12:30:26.639567: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1304] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 212 MB memory) -> physical GPU (device: 0, name: NVIDIA Tegra X1, pci bus id: 0000:00:00.0, compute capability: 5.3) 2021-05-05 12:30:26.648679: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x7eacbb15e0 initialized for platform CUDA (this does not guarantee that XLA will be used). Devices: 2021-05-05 12:30:26.648767: I tensorflow/compiler/xla/service/service.cc:176] StreamExecutor device (0): NVIDIA Tegra X1, Compute Capability 5.3 cpu backend was already registered. Reusing existing backend factory. Platform node has already been set. Overwriting the platform with [object Object]. 5 May 12:30:27 - [info] Started flows 2021-05-05 12:30:28.221079: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcudnn.so.7 2021-05-05 12:30:32.507124: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcublas.so.10.0 実際に GPU リソースが使用されているか確認する場合、jtop コマンドを実行するのが簡単です。 初回にインストールした場合、OSの再起動が必要です。既にインストールされている場合、最新の jtop コマンドがインストールされます。 以下の手順でインストールします。 $ sudo apt install python-pip $ sudo -H pip install -U jetson-stats # 初回の場合のみ $ sudo reboot 以下の手順で実行します。 $ jtop まとめ みなさま、良き Jetson Nano & Node-RED ライフを! @kitazaki/node-red-contrib-tfjs-coco-ssd モジュールの変更内容 1. package.json 変更 2. fixarm64.js 追加 3. custom-binary.json 追加 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Jetson NanoのNode-REDでTensorFlowモデルを利用する際にGPUリソースを使用するメモ (※JetPack 4.3)

はじめに Jetson Nano の Node-RED で TensorFlow モデルを試した際に GPU リソースを使用する手順をまとめておきます。(JetPack 4.3) 環境 TensorFlow.js を Node.js で利用する場合、Jetson Nano の GPU リソースを使用するためには環境が重要です。 @tensorflow/tfjs-node の最新バージョン(2021年5月3日時点)は v1.7.4 TensorFlow v1.15.0 が指定されている TensorFlow shared libraries が必要だが、arm64 でビルドされたものを custom-binary.json で指定する必要がある arm64 でビルドされた TensorFlow shared libraries は CUDA 10.0 と cuDNN 7 ライブラリを使用している Jetson Nano の環境は JetPack 4.3 を使用する必要があります。 (最新の JetPack 4.5.1 を使用するとエラーが出て使用できませんでした。) リリース時期 JetPack CUDA cuDNN 対象 2019/12 4.3 10.0.326 7.6.3 o 2020/7 4.4 10.2.89 8.0.0 DP - 2020/7 4.4.1 10.2.89 8.0.0 DP - 2021/1 4.5 10.2.89 8.0.0.180 - 2021/2 4.5.1 10.2.89 8.0.0.180 - 手順 簡単に試したい場合は、後ろの手順(簡単に試す場合の手順)を参照してください。 1. Node-REDのインストール 以下のコマンドを実行して、Jetson Nano に Node-RED をインストールします。 $ bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered) 質問を聞かれた場合は、y を入力します。(2回) Are you really sure you want to do this ? [y/N] ? y Would you like to install the Pi-specific nodes ? [y/N] ? y 2. @tensorflow/tfjs-node のインストール TensorFlow.js を Node-RED(Node.js) で使用するために、@tensorflow/tfjs-node モジュールをインストールします。 $ cd ~/.node-red $ npm i @tensorflow/tfjs-node@1.7.4 エラーが表示されるので、以下の手順を実施します。 $ cd node_modules/@tensorflow/tfjs-node custom-binary.json ファイルを作成します。 $ vi scripts/custom-binary.json custom-binary.json { "tf-lib": "https://s3.us.cloud-object-storage.appdomain.cloud/tfjs-cos/libtensorflow-gpu-linux-arm64-1.15.0.tar.gz" } 再度インストールします。 $ npm i 3. node-red-contrib-tfjs-coco-ssd のインストール COCO モデルを使用した SSD によるオブジェクト検出を試すために、 node-red-contrib-tfjs-coco-ssd モジュールをインストールします。 node-red-contrib-tfjs-coco-ssd は 依存関係に @tensorflow/tfjs-node モジュールのバーション 1.4.0 が指定されているため、最新バージョン (1.7.4) へ変更する必要があります。 $ cd ~/.node-red $ npm i node-red-contrib-tfjs-coco-ssd エラーが表示されるので、以下の手順を実施します。 $ cd node_modules/node-red-contrib-tfjs-coco-ssd package.json の依存関係で、@tensorflow/tfjs-node に指定されているバージョンを 1.4.0 から 1.7.4 へ変更します。 package.json "@tensorflow/tfjs-node": "1.4.0", ↓ "@tensorflow/tfjs-node": "1.7.4", エラーが表示されるので、2. @tensorflow/tfjs-node のインストールと同様に、以下の手順を実施します。 $ cd node_modules/@tensorflow/tfjs-node custom-binary.json ファイルを作成します。 $ vi scripts/custom-binary.json custom-binary.json { "tf-lib": "https://s3.us.cloud-object-storage.appdomain.cloud/tfjs-cos/libtensorflow-gpu-linux-arm64-1.15.0.tar.gz" } 再度インストールします。 $ npm i package-lock.json を削除します。 (@tensorflow/tfjs-node モジュールのバーション 1.4.0 をインストールした情報が残っているため) $ cd ~/.node-red $ rm package-lock.json 4. Node-RED を起動します。 $ node-red-start Node-RED の起動ログが表示されますので、起動が完了したら Ctrl + C で抜けます。 停止する場合は、以下のコマンドを実行します。 $ node-red-stop 簡単に試す場合の手順 node-red-contrib-tfjs-coco-ssd モジュールを fork して導入手順を簡略化しています。 1. Node-REDのインストール 以下のコマンドを実行して、Jetson Nano に Node-RED をインストールします。 $ bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered) 質問を聞かれた場合は、y を入力します。(2回) Are you really sure you want to do this ? [y/N] ? y Would you like to install the Pi-specific nodes ? [y/N] ? y 2. @kitazaki/node-red-contrib-tfjs-coco-ssd のインストール $ cd ~/.node-red $ npm i @kitazaki/node-red-contrib-tfjs-coco-ssd エラーが表示されるので、以下の手順を実施します。 (インストールの中で @tensorflow/tfjs-node の custom-binary.json を作成しているので、2回目のインストールで成功します) $ cd node_modules/@tensorflow/tfjs-node/ $ npm i 3. Node-RED を起動します。 $ node-red-start Node-RED の起動ログが表示されますので、起動が完了したら Ctrl + C で抜けます。 停止する場合は、以下のコマンドを実行します。 $ node-red-stop サンプルのフローを動かす USB カメラで撮影した画像を使用してオブジェクト検出し、結果を Node-RED のフロー上に表示するため、以下の2つのモジュールをインストールします。 node-red-contrib-image-output node-red-contrib-usbcamera node-red-contrib-usbcamera モジュールを使用するためには、fswebcam コマンドをインストールする必要があります。 $ sudo apt update $ sudo apt install fswebcam $ cd ~/.node-red $ npm i node-red-contrib-image-output $ npm i node-red-contrib-usbcamera モジュールをインストールした後は Node-RED の停止・起動を行います。 $ node-red-stop $ node-red-start サンプルのフローをインポートします。 flows.json [{"id":"7b70c5ee.6f8b54","type":"tab","label":"フロー 1","disabled":false,"info":""},{"id":"536b8b06.e08124","type":"tensorflowCoco","z":"7b70c5ee.6f8b54","name":"","modelUrl":"http://localhost:1880/coco/model.json","scoreThreshold":0.5,"passthru":"bbox","lineColour":"magenta","x":530,"y":340,"wires":[["322a680c.2a6458","91d145e.e45deb8"]]},{"id":"974b536b.811538","type":"image","z":"7b70c5ee.6f8b54","name":"","width":160,"data":"payload","dataType":"msg","thumbnail":false,"active":true,"pass":false,"outputs":0,"x":540,"y":160,"wires":[]},{"id":"6bc3a717.18fcd","type":"http request","z":"7b70c5ee.6f8b54","name":"","method":"GET","ret":"bin","paytoqs":"ignore","url":"https://upload.wikimedia.org/wikipedia/commons/b/b3/Team_Queerala.jpg","tls":"","persist":false,"proxy":"","authType":"","x":310,"y":280,"wires":[["974b536b.811538","536b8b06.e08124","8f34f7cf.94bfe8"]]},{"id":"71825deb.2c1e34","type":"inject","z":"7b70c5ee.6f8b54","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":120,"y":280,"wires":[["6bc3a717.18fcd"]]},{"id":"322a680c.2a6458","type":"debug","z":"7b70c5ee.6f8b54","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":710,"y":300,"wires":[]},{"id":"91d145e.e45deb8","type":"image","z":"7b70c5ee.6f8b54","name":"","width":"320","data":"image","dataType":"msg","thumbnail":false,"active":true,"pass":false,"outputs":0,"x":740,"y":340,"wires":[]},{"id":"8f34f7cf.94bfe8","type":"debug","z":"7b70c5ee.6f8b54","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":510,"y":100,"wires":[]},{"id":"20417db3.6bb88a","type":"usbcamera","z":"7b70c5ee.6f8b54","filemode":"0","filename":"image01.jpg","filedefpath":"1","filepath":"","fileformat":"jpeg","resolution":"2","name":"","x":310,"y":340,"wires":[["974b536b.811538","8f34f7cf.94bfe8","536b8b06.e08124"]]},{"id":"e39ca5b2.147f48","type":"inject","z":"7b70c5ee.6f8b54","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":120,"y":340,"wires":[["20417db3.6bb88a"]]}] サンプルのフローはGithubにも置いておきます。 動作確認 Node-RED を実行し、サンプルフローを読み込んだ後、以下のようなログが出力されれば正常です。 5 May 12:30:23 - [info] Starting flows 2021-05-05 12:30:24.866596: W tensorflow/core/platform/profile_utils/cpu_utils.cc:98] Failed to find bogomips in /proc/cpuinfo; cannot determine CPU frequency 2021-05-05 12:30:24.867601: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x7f3dbf7290 initialized for platform Host (this does not guarantee that XLA will be used). Devices: 2021-05-05 12:30:24.867990: I tensorflow/compiler/xla/service/service.cc:176] StreamExecutor device (0): Host, Default Version 2021-05-05 12:30:24.895666: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcuda.so.1 2021-05-05 12:30:24.916967: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:950] ARM64 does not support NUMA - returning NUMA node zero 2021-05-05 12:30:24.917130: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1618] Found device 0 with properties: name: NVIDIA Tegra X1 major: 5 minor: 3 memoryClockRate(GHz): 0.9216 pciBusID: 0000:00:00.0 2021-05-05 12:30:24.923907: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcudart.so.10.0 2021-05-05 12:30:24.937424: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcublas.so.10.0 2021-05-05 12:30:24.953026: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcufft.so.10.0 2021-05-05 12:30:24.958246: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcurand.so.10.0 2021-05-05 12:30:24.974519: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcusolver.so.10.0 2021-05-05 12:30:24.983350: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcusparse.so.10.0 2021-05-05 12:30:25.032299: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcudnn.so.7 2021-05-05 12:30:25.032490: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:950] ARM64 does not support NUMA - returning NUMA node zero 2021-05-05 12:30:25.032660: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:950] ARM64 does not support NUMA - returning NUMA node zero 2021-05-05 12:30:25.032749: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1746] Adding visible gpu devices: 0 2021-05-05 12:30:26.638460: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1159] Device interconnect StreamExecutor with strength 1 edge matrix: 2021-05-05 12:30:26.638579: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1165] 0 2021-05-05 12:30:26.638612: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1178] 0: N 2021-05-05 12:30:26.638878: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:950] ARM64 does not support NUMA - returning NUMA node zero 2021-05-05 12:30:26.639051: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:950] ARM64 does not support NUMA - returning NUMA node zero 2021-05-05 12:30:26.639201: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:950] ARM64 does not support NUMA - returning NUMA node zero 2021-05-05 12:30:26.639567: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1304] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 212 MB memory) -> physical GPU (device: 0, name: NVIDIA Tegra X1, pci bus id: 0000:00:00.0, compute capability: 5.3) 2021-05-05 12:30:26.648679: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x7eacbb15e0 initialized for platform CUDA (this does not guarantee that XLA will be used). Devices: 2021-05-05 12:30:26.648767: I tensorflow/compiler/xla/service/service.cc:176] StreamExecutor device (0): NVIDIA Tegra X1, Compute Capability 5.3 cpu backend was already registered. Reusing existing backend factory. Platform node has already been set. Overwriting the platform with [object Object]. 5 May 12:30:27 - [info] Started flows 2021-05-05 12:30:28.221079: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcudnn.so.7 2021-05-05 12:30:32.507124: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcublas.so.10.0 実際に GPU リソースが使用されているか確認する場合、jtop コマンドを実行するのが簡単です。 初回にインストールした場合、OSの再起動が必要です。既にインストールされている場合、最新の jtop コマンドがインストールされます。 以下の手順でインストールします。 $ sudo apt install python-pip $ sudo -H pip install -U jetson-stats # 初回の場合のみ $ sudo reboot 以下の手順で実行します。 $ jtop まとめ みなさま、良き Jetson Nano & Node-RED ライフを! @kitazaki/node-red-contrib-tfjs-coco-ssd モジュールの変更内容 1. package.json 変更 2. fixarm64.js 追加 3. custom-binary.json 追加 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む