YutaroOgawa / pytorch_advanced

書籍「つくりながら学ぶ! PyTorchによる発展ディープラーニング」の実装コードを配置したリポジトリです
MIT License
844 stars 334 forks source link

【第7章】7-6_Transformerでのwiki-news-300d-1M.vec.pt is a zip archiveエラーについて #192

Closed onozuka777 closed 2 years ago

onozuka777 commented 2 years ago

小川先生

楽しく拝読しております。 第7章の

'''

動作確認
前節のDataLoaderなどを取得

from utils.dataloader import get_IMDb_DataLoaders_and_TEXT train_dl, val_dl, test_dl, TEXT = get_IMDb_DataLoaders_and_TEXT( max_length=256, batch_size=24)

ミニバッチの用意

batch = next(iter(train_dl))

モデル構築

net1 = Embedder(TEXT.vocab.vectors)

入出力

x = batch.Text[0] x1 = net1(x) # 単語をベクトルに

print("入力のテンソルサイズ:", x.shape) print("出力のテンソルサイズ:", x1.shape)

の部分で、 以下のようなエラーが出ました。(以下、エラー全文) '''

'''

ValueError Traceback (most recent call last) /usr/local/anaconda3/envs/37prod/lib/python3.7/tarfile.py in nti(s) 186 s = nts(s, "ascii", "strict") --> 187 n = int(s.strip() or "0", 8) 188 except ValueError:

ValueError: invalid literal for int() with base 8: 'q\tX\x01'

During handling of the above exception, another exception occurred:

InvalidHeaderError Traceback (most recent call last) /usr/local/anaconda3/envs/37prod/lib/python3.7/tarfile.py in next(self) 2286 try: -> 2287 tarinfo = self.tarinfo.fromtarfile(self) 2288 except EOFHeaderError as e:

/usr/local/anaconda3/envs/37prod/lib/python3.7/tarfile.py in fromtarfile(cls, tarfile) 1094 buf = tarfile.fileobj.read(BLOCKSIZE) -> 1095 obj = cls.frombuf(buf, tarfile.encoding, tarfile.errors) 1096 obj.offset = tarfile.fileobj.tell() - BLOCKSIZE

/usr/local/anaconda3/envs/37prod/lib/python3.7/tarfile.py in frombuf(cls, buf, encoding, errors) 1036 -> 1037 chksum = nti(buf[148:156]) 1038 if chksum not in calc_chksums(buf):

/usr/local/anaconda3/envs/37prod/lib/python3.7/tarfile.py in nti(s) 188 except ValueError: --> 189 raise InvalidHeaderError("invalid header") 190 return n

InvalidHeaderError: invalid header

During handling of the above exception, another exception occurred:

ReadError Traceback (most recent call last) /usr/local/anaconda3/envs/37prod/lib/python3.7/site-packages/torch/serialization.py in _load(f, map_location, pickle_module, **pickle_load_args) 594 try: --> 595 return legacy_load(f) 596 except tarfile.TarError:

/usr/local/anaconda3/envs/37prod/lib/python3.7/site-packages/torch/serialization.py in legacy_load(f) 505 --> 506 with closing(tarfile.open(fileobj=f, mode='r:', format=tarfile.PAX_FORMAT)) as tar, \ 507 mkdtemp() as tmpdir:

/usr/local/anaconda3/envs/37prod/lib/python3.7/tarfile.py in open(cls, name, mode, fileobj, bufsize, kwargs) 1590 raise CompressionError("unknown compression type %r" % comptype) -> 1591 return func(name, filemode, fileobj, kwargs) 1592

/usr/local/anaconda3/envs/37prod/lib/python3.7/tarfile.py in taropen(cls, name, mode, fileobj, kwargs) 1620 raise ValueError("mode must be 'r', 'a', 'w' or 'x'") -> 1621 return cls(name, mode, fileobj, kwargs) 1622

/usr/local/anaconda3/envs/37prod/lib/python3.7/tarfile.py in init(self, name, mode, fileobj, format, tarinfo, dereference, ignore_zeros, encoding, errors, pax_headers, debug, errorlevel, copybufsize) 1483 self.firstmember = None -> 1484 self.firstmember = self.next() 1485

/usr/local/anaconda3/envs/37prod/lib/python3.7/tarfile.py in next(self) 2298 elif self.offset == 0: -> 2299 raise ReadError(str(e)) 2300 except EmptyHeaderError:

ReadError: invalid header

During handling of the above exception, another exception occurred:

RuntimeError Traceback (most recent call last)

in 4 from utils.dataloader import get_IMDb_DataLoaders_and_TEXT 5 train_dl, val_dl, test_dl, TEXT = get_IMDb_DataLoaders_and_TEXT( ----> 6 max_length=256, batch_size=24) 7 8 # ミニバッチの用意 ~/Python/PyTorchによる発展ディープラーニング/pytorch_advanced-master/7_nlp_sentiment_transformer/utils/dataloader.py in get_IMDb_DataLoaders_and_TEXT(max_length, batch_size) 114 115 # torchtextで単語ベクトルとして英語学習済みモデルを読み込みます --> 116 english_fasttext_vectors = Vectors(name='data/wiki-news-300d-1M.vec') 117 118 # ベクトル化したバージョンのボキャブラリーを作成します /usr/local/anaconda3/envs/37prod/lib/python3.7/site-packages/torchtext/vocab.py in __init__(self, name, cache, url, unk_init, max_vectors) 321 self.dim = None 322 self.unk_init = torch.Tensor.zero_ if unk_init is None else unk_init --> 323 self.cache(name, cache, url=url, max_vectors=max_vectors) 324 325 def __getitem__(self, token): /usr/local/anaconda3/envs/37prod/lib/python3.7/site-packages/torchtext/vocab.py in cache(self, name, cache, url, max_vectors) 430 else: 431 logger.info('Loading vectors from {}'.format(path_pt)) --> 432 self.itos, self.stoi, self.vectors, self.dim = torch.load(path_pt) 433 434 def __len__(self): /usr/local/anaconda3/envs/37prod/lib/python3.7/site-packages/torch/serialization.py in load(f, map_location, pickle_module, **pickle_load_args) 424 if sys.version_info >= (3, 0) and 'encoding' not in pickle_load_args.keys(): 425 pickle_load_args['encoding'] = 'utf-8' --> 426 return _load(f, map_location, pickle_module, **pickle_load_args) 427 finally: 428 if new_fd: /usr/local/anaconda3/envs/37prod/lib/python3.7/site-packages/torch/serialization.py in _load(f, map_location, pickle_module, **pickle_load_args) 597 if _is_zipfile(f): 598 # .zip is used for torch.jit.save and will throw an un-pickling error here --> 599 raise RuntimeError("{} is a zip archive (did you mean to use torch.jit.load()?)".format(f.name)) 600 # if not a tarfile, reset file offset and proceed 601 f.seek(0) RuntimeError: .vector_cache/wiki-news-300d-1M.vec.pt is a zip archive (did you mean to use torch.jit.load()?) ''' ### 何がまずいのか、ググってもよく分からない状態です。 思い当たることなどあるでしょうか。 ご教示いただけますと幸いです。 何卒、よろしくお願い申し上げます。
YutaroOgawa commented 2 years ago

@onozuka777 さま

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

186 s = nts(s, "ascii", "strict") --> 187 n = int(s.strip() or "0", 8) 188 except ValueError:

と書かれていてascii?が気になりました。

あとは、usr/local/anaconda3/envs/37prod/環境である点が気になりました。

本書の第7章は文章を扱っており、文字コードはutf-8でUbuntuでの動作を前提にしています。

「実行環境がWindows系のマシンで、文字コード系のなにかにひっかかっていることはないだろうか?」 と気になったのですが、その点はいかがでしょうか?

onozuka777 commented 2 years ago

小川先生、お忙しい中お答えいただき、ありがとうございます。 環境なのですが、会社のubuntuを用いております。 ただ、複数の人が入れるように、 Jupyter Hubを使って、WIndowsからプログラムを使っております。 第7章の最初に環境をmakeする部分は、そのJupyter Hubから構築しました。 Windowsが関係しているとすると、このサーバをSAMBAでWindowsからもファイルのやり取りができるようにしている ことです。ただ、今回のプログラムに関してはWIndows側からSAMBAでファイルを送るようなことはしておりません。 SAMBAにしていることは何か関係あるか、こうなるとこちらの問題なのかもしれませんが、ご存じであれば ご教示いただけますと幸いです。 お手数おかけします。 何卒、よろしくお願い申し上げます。

YutaroOgawa commented 2 years ago

@onozuka777 さま

状況の情報をありがとうございます。 会社環境ですと、なかなかいろいろ面倒で大変な点は多いですね。

今回のエラーを見ていると、

train_dl, val_dl, test_dl, TEXT = get_IMDb_DataLoaders_and_TEXT( ----> 6 max_length=256, batch_size=24)

が最初のエラー箇所で、

それは

/utils/dataloader.pyにある、get_IMDb_DataLoaders_and_TEXT(max_length, batch_size)関数であり、

115 # torchtextで単語ベクトルとして英語学習済みモデルを読み込みます --> 116 english_fasttext_vectors = Vectors(name='data/wiki-news-300d-1M.vec')

がひっかかっているようですね。

この 「data/wiki-news-300d-1M.vec」のファイルを用意し、フォルダ「data」に格納済みという認識で合っていますか?

onozuka777 commented 2 years ago

image 小川先生、ご返事が遅れてしまって大変すみません。上記、映っていたら良いのですが、SAMBAでWindows側から見たdataフォルダの中ですが、data/wiki-news-300d-1M.vec は確かにあるように見えます。このファイルが正しいものかどうかを判断する方法ってあるかどうかご存知でしょうか。 お手数をおかけします。何卒、よろしくお願い申し上げます。

YutaroOgawa commented 2 years ago

@onozuka777 さま

とても丁寧にありがとうございます。 キャプチャも助かります。

見る限り、ファイルは存在しますね。

なかなか、環境が特殊で難しいですが、 ファイルが大きいので、zip解凍に失敗した可能性などもなくはないのですが、、、 うまくいかず、もどかしいとは思いますが、少しずつ、問題の範囲を狭めたいと思います。

ひとまず、 [1] 7-5 7-5_IMDb_Dataset_DataLoader.ipynb (linkはこちら) は動作しているという認識でよろしいでしょうか?

[2] 続いて、エラーと絡んでいそうな場所のみを抜き出し、以下のみをJupyter Notebookで新たに実行した場合、

import math
import numpy as np
import random

import torch
import torch.nn as nn
import torch.nn.functional as F 
import torchtext

from utils.dataloader import get_IMDb_DataLoaders_and_TEXT

train_dl, val_dl, test_dl, TEXT = get_IMDb_DataLoaders_and_TEXT(max_length=256, batch_size=24)

# ミニバッチの用意
batch = next(iter(train_dl))

# 入出力
x = batch.Text[0]
print("入力のテンソルサイズ:", x.shape)

を実行するとどうなるか、教えていただけますでしょうか。

onozuka777 commented 2 years ago

小川先生

ご連絡ありがとうございます。 7-5_IMDb_Dataset_DataLoaderのファイルはワーニングは沢山でましたが、最後まで行きました。 いただいた上記のスクリプトも、ワーニングは沢山でましたが、

入力のテンソルサイズ: torch.Size([24, 256]) という回答が返ってきました。 何か、他に思い当たるところはあるでしょうか。 お手数をおかけしてすみません。 何卒、よろしくお願い申し上げます。

YutaroOgawa commented 2 years ago

@onozuka777 さま

早速ありがとうございます。

元々

x = batch.Text[0] x1 = net1(x) # 単語をベクトルに print("入力のテンソルサイズ:", x.shape) print("出力のテンソルサイズ:", x1.shape) の部分で、 以下のようなエラーが出ました。(以下、エラー全文)

でしたので、

x側は問題ないと分かりました。x1側を確かめたいです。

では、上記に続いて、

(セル2)

class Embedder(nn.Module):
    '''idで示されている単語をベクトルに変換します'''

    def __init__(self, text_embedding_vectors):
        super(Embedder, self).__init__()

        self.embeddings = nn.Embedding.from_pretrained(
            embeddings=text_embedding_vectors, freeze=True)
        # freeze=Trueによりバックプロパゲーションで更新されず変化しなくなります

    def forward(self, x):
        x_vec = self.embeddings(x)

        return x_vec

(セル3)

# モデル構築
net1 = Embedder(TEXT.vocab.vectors)

(セル4)

# 入出力
x = batch.Text[0]
print("入力のテンソルサイズ:", x.shape)

x1 = net1(x)  # 単語をベクトルに
print("出力のテンソルサイズ:", x1.shape)

と続けると、どこでエラーになりますでしょうか?また、どのようなエラーメッセージがでますでしょうか?

onozuka777 commented 2 years ago

小川先生

ご連絡いただき、ありがとうございます。 セル4までいけて、下記がプリントされました。

入力のテンソルサイズ: torch.Size([24, 256]) 出力のテンソルサイズ: torch.Size([24, 256, 300])

お手数をおかけします。 何卒、よろしくお願い申し上げます。

YutaroOgawa commented 2 years ago

@onozuka777 さま

ありがとうございます。

本Issueの一番最初、

ミニバッチの用意 batch = next(iter(train_dl))

モデル構築 net1 = Embedder(TEXT.vocab.vectors)

入出力 x = batch.Text[0] x1 = net1(x) # 単語をベクトルに

print("入力のテンソルサイズ:", x.shape) print("出力のテンソルサイズ:", x1.shape)

の部分で、 以下のようなエラーが出ました。(以下、エラー全文)

でしたが、これは上のコメントでの

x1 = net1(x)  # 単語をベクトルに
print("出力のテンソルサイズ:", x1.shape)

を試していただくと、今度はエラーなく

入力のテンソルサイズ: torch.Size([24, 256]) 出力のテンソルサイズ: torch.Size([24, 256, 300])

が出力され、なぜか問題は解決された?で合っていますか?

onozuka777 commented 2 years ago

小川先生、ご連絡が遅れてしまい大変申し訳ありません。 該当するjupyter notebookがなぜか開けなくなってしまい、しかたがないので、このgithubから再度ダウンロードして動かしたところ、問題なく動きました。動かなかった根本的な原因はよく分からないのですが、やはり我々の環境に一因があるのかもしれません。いずれにしましても、問題は解決いたしました。 1つ1つ丁寧に教えていただき、ありがとうございました。 本件、closeで大丈夫です。 また何かあった時は何卒、よろしくお願い申し上げます。

YutaroOgawa commented 2 years ago

@onozuka777 さま

ご連絡ならびにご報告をいただき、誠にありがとうございます。

会社環境ですと、いろいろ難しいものがありますね。 私も勉強になりました。

Issueは閉じておきます。

最後の報告まで、ありがとうございました!