# PyTorch代碼除錯利器: 自動print每行代碼的Tensor信息

（點擊上方快速關註並設置為星標，一起學Python）

https://mp.weixin.qq.com/s/PVIWWIqbZuEe4lwVMDYA5Q

GitHub 專案地址： https://github.com/zasdfgbnm/TorchSnooper

``RuntimeError: Expected object of scalar type Double but got scalar type Float``

TorchSnooper 就是一個設計了用來解決這個問題的工具。TorchSnooper 的安裝非常簡單，只需要執行標準的 Python 包安裝指令就好：

``pip install torchsnooper``

``def myfunc(mask, x):    y = torch.zeros(6)    y.masked_scatter_(mask, x)    return y``

``mask = torch.tensor([0, 1, 0, 1, 1, 0], device='cuda')source = torch.tensor([1.0, 2.0, 3.0], device='cuda')y = myfunc(mask, source)``

``RuntimeError: Expected object of backend CPU but got backend CUDA for argument #2 'mask'``

``import torchimport torchsnooper@torchsnooper.snoop()def myfunc(mask, x):    y = torch.zeros(6)    y.masked_scatter_(mask, x)    return ymask = torch.tensor([0, 1, 0, 1, 1, 0], device='cuda')source = torch.tensor([1.0, 2.0, 3.0], device='cuda')y = myfunc(mask, source)``

``Starting var:.. mask = tensor6,), int64, cuda:0>Starting var:.. x = tensor3,), float32, cuda:0>21:41:42.941668 call         5 def myfunc(mask, x):21:41:42.941834 line         6     y = torch.zeros(6)New var:....... y = tensor6,), float32, cpu>21:41:42.943443 line         7     y.masked_scatter_(mask, x)21:41:42.944404 exception    7     y.masked_scatter_(mask, x)``

``New var:....... y = tensor6,), float32, cpu>``

``RuntimeError: Expected object of scalar type Byte but got scalar type Long for argument #2 'mask'``

``Starting var:.. mask = tensor6,), int64, cuda:0>``

``mask = torch.tensor([0, 1, 0, 1, 1, 0], device='cuda', dtype=torch.uint8)``

``model = torch.nn.Linear(2, 1)``

``x = torch.tensor([[0.0, 0.0], [0.0, 1.0], [1.0, 0.0], [1.0, 1.0]])y = torch.tensor([3.0, 5.0, 4.0, 6.0])``

``import torchmodel = torch.nn.Linear(2, 1)x = torch.tensor([[0.0, 0.0], [0.0, 1.0], [1.0, 0.0], [1.0, 1.0]])y = torch.tensor([3.0, 5.0, 4.0, 6.0])optimizer = torch.optim.SGD(model.parameters(), lr=0.1)for _ in range(10):    optimizer.zero_grad()    pred = model(x)    squared_diff = (y - pred) ** 2    loss = squared_diff.mean()    print(loss.item())    loss.backward()    optimizer.step()``

``import torchimport torchsnoopermodel = torch.nn.Linear(2, 1)x = torch.tensor([[0.0, 0.0], [0.0, 1.0], [1.0, 0.0], [1.0, 1.0]])y = torch.tensor([3.0, 5.0, 4.0, 6.0])optimizer = torch.optim.SGD(model.parameters(), lr=0.1)with torchsnooper.snoop():    for _ in range(10):        optimizer.zero_grad()        pred = model(x)        squared_diff = (y - pred) ** 2        loss = squared_diff.mean()        print(loss.item())        loss.backward()        optimizer.step()``

``New var:....... model = Linear(in_features=2, out_features=1, bias=True)New var:....... x = tensor4, 2), float32, cpu>New var:....... y = tensor4,), float32, cpu>New var:....... optimizer = SGD (Parameter Group 0    dampening: 0    lr: 0....omentum: 0    nesterov: False    weight_decay: 0)02:38:02.016826 line        12     for _ in range(10):New var:....... _ = 002:38:02.017025 line        13         optimizer.zero_grad()02:38:02.017156 line        14         pred = model(x)New var:....... pred = tensor4, 1), float32, cpu, grad>02:38:02.018100 line        15         squared_diff = (y - pred) ** 2New var:....... squared_diff = tensor4, 4), float32, cpu, grad>02:38:02.018397 line        16         loss = squared_diff.mean()New var:....... loss = tensor02:38:02.018674 line        17         print(loss.item())02:38:02.018852 line        18         loss.backward()26.97929000854492202:38:02.057349 line        19         optimizer.step()``

``New var:....... model = Linear(in_features=2, out_features=1, bias=True)New var:....... x = tensor4, 2), float32, cpu>New var:....... y = tensor4,), float32, cpu>New var:....... optimizer = SGD (Parameter Group 0    dampening: 0    lr: 0....omentum: 0    nesterov: False    weight_decay: 0)02:46:23.545042 line        12     for _ in range(10):New var:....... _ = 002:46:23.545285 line        13         optimizer.zero_grad()02:46:23.545421 line        14         pred = model(x).squeeze()New var:....... pred = tensor4,), float32, cpu, grad>02:46:23.546362 line        15         squared_diff = (y - pred) ** 2New var:....... squared_diff = tensor4,), float32, cpu, grad>02:46:23.546645 line        16         loss = squared_diff.mean()New var:....... loss = tensor02:46:23.546939 line        17         print(loss.item())02:46:23.547133 line        18         loss.backward()02:46:23.591090 line        19         optimizer.step()``
{"ft_lang_label":"__label__zh","ft_lang_prob":0.5328122,"math_prob":0.989811,"size":6000,"snap":"2021-21-2021-25","text_gpt3_token_len":3523,"char_repetition_ratio":0.15193462,"word_repetition_ratio":0.38653,"special_character_ratio":0.372,"punctuation_ratio":0.33518776,"nsfw_num_words":0,"has_unicode_error":false,"math_prob_llama3":0.9945446,"pos_list":[0],"im_url_duplicate_count":[null],"WARC_HEADER":"{\"WARC-Type\":\"response\",\"WARC-Date\":\"2021-06-20T07:48:00Z\",\"WARC-Record-ID\":\"<urn:uuid:cae2b473-00c5-4cbf-aea3-98eb3e8d91f0>\",\"Content-Length\":\"106019\",\"Content-Type\":\"application/http; msgtype=response\",\"WARC-Warcinfo-ID\":\"<urn:uuid:cd6b0c55-bc70-4fb8-8bd1-4debcfe73425>\",\"WARC-Concurrent-To\":\"<urn:uuid:81699bb3-a624-4487-9f4d-08a5413f228d>\",\"WARC-IP-Address\":\"104.21.80.150\",\"WARC-Target-URI\":\"https://www.ipshop.xyz/15415.html\",\"WARC-Payload-Digest\":\"sha1:6ULJONFSV5UDIPOQJ5XG7U4LKNUOOW4M\",\"WARC-Block-Digest\":\"sha1:IWZFDGVB3BTQICXM5PKNFOYDPBHBZEKN\",\"WARC-Identified-Payload-Type\":\"text/html\",\"warc_filename\":\"/cc_download/warc_2021/CC-MAIN-2021-25/CC-MAIN-2021-25_segments_1623487658814.62_warc_CC-MAIN-20210620054240-20210620084240-00613.warc.gz\"}"}