Gin5050 / deep-learning-with-pytorch-ja

deep-learning-with-pytorchの日本語版repositoryです。
124 stars 55 forks source link

p2ch13/p2_run_everything.ipynbにつきまして #5

Open KK-Saito opened 3 years ago

KK-Saito commented 3 years ago

はじめまして PyTorch実践入門 を購入して、勉強しています。

Google ColaboratoryのGPU環境でp2_run_everything.ipynbを実行しています。 Google Driveをマウントして,なんとかChapter 12までは実行できて,TensorBoardも表示できたのですが,Chapter 13以降が実行できません。

具体的には,p2_run_everything.ipynbのChapter 13の最初のコマンド  run('p2ch13.prepcache.LunaPrepCacheApp') を実行すると,下記のようなエラーが出ます。

/usr/local/lib/python3.7/dist-packages/torch/_utils.py in reraise(self) 427 # have message field 428 raise self.exc_type(message=msg) --> 429 raise self.exc_type(msg) 430 431

IndexError: Caught IndexError in DataLoader worker process 0. Original Traceback (most recent call last): File "/usr/local/lib/python3.7/dist-packages/torch/utils/data/_utils/worker.py", line 202, in _worker_loop data = fetcher.fetch(index) File "/usr/local/lib/python3.7/dist-packages/torch/utils/data/_utils/fetch.py", line 44, in fetch data = [self.dataset[idx] for idx in possibly_batched_index] File "/usr/local/lib/python3.7/dist-packages/torch/utils/data/_utils/fetch.py", line 44, in data = [self.dataset[idx] for idx in possibly_batched_index] File "/content/drive/My Drive/Colab Notebooks/Deep_Learning_with_PyTorch/p2ch13/dsets.py", line 399, in getitem candidateInfo_tup.series_uid, candidateInfo_tup.center_xyz, (7, 96, 96) File "/usr/local/lib/python3.7/dist-packages/diskcache/core.py", line 1889, in wrapper result = func(*args, **kwargs) File "/content/drive/My Drive/Colab Notebooks/Deep_Learning_with_PyTorch/p2ch13/dsets.py", line 244, in getCtRawCandidate ct = getCt(series_uid) File "/content/drive/My Drive/Colab Notebooks/Deep_Learning_with_PyTorch/p2ch13/dsets.py", line 239, in getCt return Ct(series_uid) File "/content/drive/My Drive/Colab Notebooks/Deep_Learning_with_PyTorch/p2ch13/dsets.py", line 112, in init )[0] IndexError: list index out of range

data-unversioned\cacheフォルダにpart2ch13_rawというフォルダは作られるのですが,キャッシュファイルが作成できていません。

せっかくpart2ch12までは実行できましたので,なんとかしてpart2ch13以降も動かしたいと思いますので,できましたらヒントをいただければ幸いです。

Gin5050 commented 3 years ago

KK-Saitoさん 本書を活用していただきありがとうございます。 また、お返事が遅れてしまい申し訳ありません。

ご質問の件ですが、おそらくデータが足りてないと思われます。 実行に必要なファイル(3つのcsv)が存在しているか再度ご確認お願いいたします。 それでもエラーが起きる場合は、お手数ですが学習用のsubsetをsubset0~subset9まで揃えて実行できるか試していただけますでしょうか。

KK-Saito commented 3 years ago

回答ありがとうございます。

3つのcsvファイルは確かに存在します。(part2ch12までは実行できていますので。) データにつきましては,確かにsubset0だけで実行していました。 subset1~subset9も揃えて実行してみたいと思います。

データの保存場所についてですが,subset0のデータにつきましては /content/drive/MyDrive/Colab Notebooks/Deep_Learning_with_PyTorch/data-unversioned/part2/luna/subset0 のフォルダに入れているのですが, subset1~subset9のデータは /content/drive/MyDrive/Colab Notebooks/Deep_Learning_with_PyTorch/data-unversioned/part2/luna/subset1 /content/drive/MyDrive/Colab Notebooks/Deep_Learning_with_PyTorch/data-unversioned/part2/luna/subset2 ・・・ /content/drive/MyDrive/Colab Notebooks/Deep_Learning_with_PyTorch/data-unversioned/part2/luna/subset9 のように,フォルダを分けて保存すればよいのでしょうか?

KK-Saito commented 3 years ago

もう一点,質問があるのですが,  https://luna16.grand-challenge.org/download/ からダウンロードした  seg-lungs-LUNA16 フォルダは,p2_run_everything.ipynbのpart2ch13以降の実行には必要ないのでしょうか? セグメンテーションには必要な気がするのですが,テキストに記述はなかったと思いますが。

できれば御回答いただければ幸いです。

Gin5050 commented 3 years ago

ご質問ありがとうございます。

1点目のデータの保存場所についてはその通りです。 p2ch13/dsets.pyの以下のように読み取るので参考までに載せておきます。

@functools.lru_cache(1)
def getCandidateInfoList(requireOnDisk_bool=True):
    # We construct a set with all series_uids that are present on disk.
    # This will let us use the data, even if we haven't downloaded all of
    # the subsets yet.
    mhd_list = glob.glob("data-unversioned/part2/luna/subset*/*.mhd")
    presentOnDisk_set = {os.path.split(p)[-1][:-4] for p in mhd_list}

2点目の内容ですが、本書では必要ありません。 seg-lungs-LUNA16の中身を見たわけではありませんが、おそらくセグメンテーションの教師データということで必要ではと思われたのだと推測します。 13章では3次元のCTデータと結節の位置情報から教師データの作成も行うので、テキスト記載のデータのみで可能です(P446 13.5.3をご参照ください)。

KK-Saito commented 3 years ago

回答ありがとうございます。

現在,subset1~subset9をGoogle Driveにアップロードしているところです。 1つのsubsetをアップロードするのに1時間ほどかかるので,9時間ほどかかるようです。

seg-lungs-LUNA16につきましても,ありがとうございました。

subset0~subset9まで揃えて実行できればうれしいのですが,そろそろColab Proを契約しないと無理かもしれません。

KK-Saito commented 3 years ago

ありがとうございました。

無事,p2_run_everything.ipynbのChapter 13の最初のコマンド  run('p2ch13.prepcache.LunaPrepCacheApp') が実行できました。

しかし,無料版のColabを使用しているので,実行時にディスクが68.4GBまでしか使用できないため, 2021-05-09 06:40:13,447 INFO pid:58 util.util:241:enumerateWithEstimate Stuffing cache 16/538, done at 2021-05-09 10:27:52, 3:54:12 の途中で  OSError: [Errno 28] No space left on device というエラーが出て止まってしまいました。

このため,Colab Proを契約するかどうか検討中です。

KK-Saito commented 3 years ago

たびたび報告させていただきますが,Colab Proを契約したのですが,結局ディスク容量が足りません。

147.15GB使用できるのですが, 2021-05-09 07:52:03,967 INFO pid:78 util.util:241:enumerateWithEstimate Stuffing cache 64/538, done at 2021-05-09 10:31:39, 3:00:50 の途中で,  OSError: [Errno 5] Input/output error: 'data-unversioned/cache/part2ch13_raw/031/56/92' というエラーが出て,止まってしまいました。

そこで,半分のデータで実行してみようと思うのですが,  subset0~subset4 のデータを使うか,  subset0~subset9 のそれぞれのsubsetの半分のデータ を使うか迷っています。 半分のデータを使う場合,どちらがよろしいでしょうか?

また,そもそも半分のデータで実行できるのでしょうか?

できれば御回答いただけると助かります。

KK-Saito commented 3 years ago

度々すみませんが,subset0~subset4のデータだけを使って実行してみたのですが,最初と同じ  IndexError: list index out of range エラーが出て止まってしまいました。 やはりsubset0~subset9のすべてのデータが揃っていないと動かないようです。

せっかくColab Proを契約しても,ディスク容量が147.15GBまでしか使用できないのでは,subset0~subset9のすべてのデータで実行することはできそうもありません。

どうすればGoogle Colabで実行できるのか,できればヒントをいただけると助かります。

Gin5050 commented 3 years ago

KK-Saito さん

ご指摘の件ですが、コードを修正したので改善したと思われます。 p2ch13/dsets.pyp2_run_everything.ipynbの内容を修正しました。

お手数ですが、コードを置き換えて再度実行していただけますでしょうか? 今度はsubset0のみでも動作するはずです。 (再実行の際はcacheフォルダの削除をお願いします)

対応に時間がかかってしまい誠に申し訳ございません。

KK-Saito commented 3 years ago

丁寧にご対応いただき,ありがとうございます。

明日にでも新しいファイルで再度実行してみたいと思います。

KK-Saito commented 3 years ago

色々ご対応いただき,ありがとうございました。

無事,subset0のみでp2_run_everything.ipynbのChapter 13の部分が実行できました。 せっかくですから,エポック数を増やしてもう少しいろいろ試してみたいと思います。 また,subset0のみを使用した状態で,まだ79GBほどディスク容量が空いていますので,もう少しデータを増やしてやってみようと思います。

ただ,少し気になりますのは,元のp2_run_everything.ipynbにあった  run('p2ch13.train_cls.LunaTrainingApp', f'--epochs={final_epochs}', '--balanced', '--augmented', 'final-cls') と  run('p2ch13.train_seg.LunaTrainingApp', f'--epochs={seg_epochs}', '--augmented', 'final-seg') は実行できませんでしたが,日本語版ではこの部分は用意していないということでしょうか? ご用意いただいた,  run('p2ch13.training.SegmentationTrainingApp', f'--epochs={experiment_epochs}', '--augmented') でTensorBoardの出力も確認できましたので,これで問題ないとは思いますが。

Gin5050 commented 3 years ago

KK-Saito 様

実行できたということでよかったです。 ここまでに大変お手数をおかけして申し訳ございませんでした。

run('p2ch13.train_cls.LunaTrainingApp', f'--epochs={final_epochs}', '--balanced', '--augmented', 'final-cls') と  run('p2ch13.train_seg.LunaTrainingApp', f'--epochs={seg_epochs}', '--augmented', 'final-seg')

上記については本家のコードがそもそも誤っており、私たちがそれを見逃してしまったのが原因です。 したがって、日本語版でできないというよりは元のリポジトリでも実行できないです。 (p2ch13/training.pyにはそもそもLunaTrainingAppというクラスは存在しない)

最後に、この度は貴重なご意見をありがとうございました。 今後ともよろしくお願いいたします。

KK-Saito commented 3 years ago

一読者の質問にこれほど丁寧に御対応いただけるとは思っていませんでしたので,大変感謝しております。 ありがとうございました。

ここまできたらChapter 14のプログラムも実行させたいと思いますので,今後ともよろしく御願いいたします。 Chapter 14につきましては,別スレッドにしようかと思いますが,とりあえずp2ch13/dsets.pyをp2ch14/dsets.pyにコピーすれば動きますでしょうか?

KK-Saito commented 3 years ago

subset0~subset3のデータを使って20エポックまで実行してみました。 実行中にディスクの残りが30GB程度になり,警告メッセージが出ましたので,Colab Proで実行する場合では,これ以上のデータは使えないようです。 subset0~subset3の中には  240 training series, 2727 slices, 326 nodules  27 validation series, 344 slices, 40 nodules 個のデータがありました。 subset0だけだと  80 training series, 890 slices, 101 nodules  9 validation series, 81 slices, 11 nodules 個のデータでしたので,ちょうど3倍というところです。 TensorBoardの出力結果を見ると,ほぼテキストp.480 図13.18と同じ結果が得られました。

ありがとうございました。

Gin5050 commented 3 years ago

Chapter 14につきましては,別スレッドにしようかと思いますが,とりあえずp2ch13/dsets.pyをp2ch14/dsets.pyにコピーすれば動きますでしょうか?

Chapter 14についても修正したので最新のリポジトリに置き換えるか、KK-Saito 様がおっしゃるようにp2ch13の該当箇所のみをp2ch14/dsets.pyにコピーするでも大丈夫です

VAN613 commented 3 years ago

KK-Saitoさん 私はsubset0~subset9全てをダウンロードして実行しましたが、同様に「../p2ch13/dsets.pyの112行目で  IndexError: list index out of range となりました。なので、恐らく本当に何かが足りないような気がしています。大体やっている事は理解出来たので「まあいいか」と諦めていたのですが、無事、私の環境でも実行出来ました。質問して下さりどうもありがとうございました!  ※対応して下さったGin5050さんもありがとうございます