Тип ввода (MPSFloatType) и тип веса (torch.FloatTensor) должны быть одинаковыми.

Вопрос или проблема

Я пытаюсь запустить этот ноутбук на Apple M1 (1-го поколения) с MacOS 12.4,

замороженные библиотеки:


>pip3 freeze
anyio @ file:///private/tmp/jupyterlab--anyio-20211211-70040-1yv1wmx/anyio-3.4.0
appnope==0.1.2
argon2-cffi @ file:///private/tmp/jupyterlab--argon2-cffi-20211211-70040-1er07d0/argon2-cffi-21.2.0
argon2-cffi-bindings @ file:///private/tmp/jupyterlab--argon2-cffi-bindings-20211211-70040-o64kwi/argon2-cffi-bindings-21.2.0
asttokens==2.0.5
attrs @ file:///private/tmp/jupyterlab--attrs-20211211-70040-6u3qxt/attrs-21.2.0
Babel==2.9.1
backcall @ file:///private/tmp/jupyterlab--backcall-20211211-70040-acdr42/backcall-0.2.0
beniget==0.4.1
black==21.12b0
bleach==4.1.0
certifi==2022.5.18.1
cffi==1.15.0
charset-normalizer==2.0.12
click==8.0.3
cycler==0.10.0
Cython==0.29.24
debugpy @ file:///private/tmp/jupyterlab--debugpy-20211211-70040-2j9lay/debugpy-1.5.1
decorator==5.1.0
defusedxml @ file:///private/tmp/jupyterlab--defusedxml-20211211-70040-uowur4/defusedxml-0.7.1
entrypoints @ file:///private/tmp/jupyterlab--entrypoints-20211211-70040-1r2y5g4/entrypoints-0.3
et-xmlfile==1.1.0
executing==0.8.2
finnhub-python==2.4.5
gast==0.5.2
GDAL==3.4.0
gensim==4.1.2
graphviz==0.19.1
idna==3.3
imageio==2.13.5
ipykernel==6.6.0
ipython==7.30.1
ipython-genutils==0.2.0
ipywidgets==7.6.5
jedi==0.18.1
Jinja2==3.0.3
joblib==1.1.0
json5==0.9.6
jsonschema @ file:///private/tmp/jupyterlab--jsonschema-20211211-70040-1np642r/jsonschema-4.2.1
jupyter==1.0.0
jupyter-client==7.1.0
jupyter-console==6.4.0
jupyter-core==4.9.1
jupyter-server @ file:///private/tmp/jupyterlab--jupyter-server-20211211-70040-1u7h7vl/jupyter_server-1.13.1
jupyterlab @ file:///private/tmp/jupyterlab-20211211-70040-1ltrjpx/jupyterlab-3.2.5
jupyterlab-pygments==0.1.2
jupyterlab-server @ file:///private/tmp/jupyterlab--jupyterlab-server-20211211-70040-iufjhi/jupyterlab_server-2.8.2
jupyterlab-widgets==1.0.2
kiwisolver==1.3.2
lxml==4.6.3
MarkupSafe==2.0.1
matplotlib==3.4.3
matplotlib-inline==0.1.3
midi @ git+https://github.com/vishnubob/python-midi.git@abb85028c97b433f74621be899a0b399cd100aaa
midi-to-dataframe @ git+https://github.com/TaylorPeer/midi-to-dataframe@35347f787f01a2326234ad278d8c40bee3817f1d
mido==1.2.10
mistune==0.8.4
multitasking==0.0.9
mypy-extensions==0.4.3
nbclassic @ file:///private/tmp/jupyterlab--nbclassic-20211211-70040-1fah2fe/nbclassic-0.3.4
nbclient @ file:///private/tmp/jupyterlab--nbclient-20211211-70040-ptwp5d/nbclient-0.5.9
nbconvert==6.3.0
nbformat==5.1.3
nest-asyncio @ file:///private/tmp/jupyterlab--nest-asyncio-20211211-70040-72pz5e/nest_asyncio-1.5.4
networkx==2.6.3
notebook==6.4.6
numpy==1.23.0rc1
openpyxl==3.0.9
packaging @ file:///private/tmp/jupyterlab--packaging-20211211-70040-1f14ddt/packaging-21.3
pandas==1.4.2
pandocfilters==1.5.0
parso==0.8.3
pathspec==0.9.0
pexpect==4.8.0
pickleshare==0.7.5
Pillow==9.1.1
platformdirs==2.4.1
ply==3.11
prometheus-client==0.12.0
prompt-toolkit @ file:///private/tmp/jupyterlab--prompt-toolkit-20211211-70040-hcpjwc/prompt_toolkit-3.0.24
ptyprocess @ file:///private/tmp/jupyterlab--ptyprocess-20211211-70040-wjbvpa/ptyprocess-0.7.0
pure-eval==0.2.1
pybind11==2.8.0
pycparser==2.21
Pygments==2.10.0
pyparsing==3.0.6
pyrsistent @ file:///private/tmp/jupyterlab--pyrsistent-20211211-70040-1fnadg/pyrsistent-0.18.0
python-dateutil==2.8.2
pythran==0.10.0
pytz==2022.1
PyWavelets==1.2.0
PyYAML==6.0
pyzmq @ file:///private/tmp/jupyterlab--pyzmq-20211211-70040-2xtuon/pyzmq-22.3.0
qtconsole==5.2.2
QtPy==2.0.0
requests==2.27.1
scikit-image==0.19.1
scikit-learn==1.1.dev0
scipy==1.8.1
seaborn==0.11.2
Send2Trash==1.8.0
six==1.16.0
smart-open==5.2.1
sniffio @ file:///private/tmp/jupyterlab--sniffio-20211211-70040-wu3dri/sniffio-1.2.0
squarify==0.4.3
stack-data==0.1.4
terminado @ file:///private/tmp/jupyterlab--terminado-20211211-70040-dw1vl6/terminado-0.12.1
testpath @ file:///private/tmp/jupyterlab--testpath-20211211-70040-895z1/testpath-0.5.0
threadpoolctl==3.0.0
tifffile==2021.11.2
tomli==1.2.3
torch==1.13.0.dev20220528
torchaudio==0.11.0
torchsummary==1.5.1
torchtext==0.10.0
torchvision==0.14.0a0+f0f8a3c
torchviz==0.0.2
tornado==6.1
tqdm==4.62.3
traitlets @ file:///private/tmp/jupyterlab--traitlets-20211211-70040-ru76xv/traitlets-5.1.1
typing_extensions==4.2.0
urllib3==1.26.9
wcwidth==0.2.5
webencodings==0.5.1
websocket-client==1.2.3
wget==3.2
widgetsnbextension==3.5.2
yfinance==0.1.64

в коде я устанавливаю device = torch.device('mps')

в этой строке: history = [evaluate(model, valid_dl)] я получаю ошибку времени выполнения

Тип ввода (MPSFloatType) и тип веса (torch.FloatTensor) должны быть одинаковыми

Полная трассировка:

---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<timed exec> in <module>

/opt/homebrew/Cellar/jupyterlab/3.2.5/libexec/lib/python3.9/site-packages/torch/autograd/grad_mode.py in decorate_context(*args, **kwargs)
     25         def decorate_context(*args, **kwargs):
     26             with self.clone():
---> 27                 return func(*args, **kwargs)
     28         return cast(F, decorate_context)
     29 

/var/folders/mz/qfpvpvf550s039lrnxg70whh0000gn/T/ipykernel_11483/1143432410.py in evaluate(model, val_loader)
      3 def evaluate(model, val_loader):
      4     model.eval()
----> 5     outputs = [model.validation_step(batch) for batch in val_loader]
      6     return model.validation_epoch_end(outputs)
      7 

/var/folders/mz/qfpvpvf550s039lrnxg70whh0000gn/T/ipykernel_11483/1143432410.py in <listcomp>(.0)
      3 def evaluate(model, val_loader):
      4     model.eval()
----> 5     outputs = [model.validation_step(batch) for batch in val_loader]
      6     return model.validation_epoch_end(outputs)
      7 

/var/folders/mz/qfpvpvf550s039lrnxg70whh0000gn/T/ipykernel_11483/446280773.py in validation_step(self, batch)
     16     def validation_step(self, batch):
     17         images, labels = batch
---> 18         out = self(images)                   # Генерация прогноза
     19         loss = F.cross_entropy(out, labels)  # Расчет потерь
     20         acc = accuracy(out, labels)          # Расчет точности

/opt/homebrew/Cellar/jupyterlab/3.2.5/libexec/lib/python3.9/site-packages/torch/nn/modules/module.py in _call_impl(self, *input, **kwargs)
   1128         if not (self._backward_hooks или self._forward_hooks или self._forward_pre_hooks или _global_backward_hooks
   1129                 или _global_forward_hooks или _global_forward_pre_hooks):
-> 1130             return forward_call(*input, **kwargs)
   1131         # Не вызывать функции, когда используются jit
   1132         full_backward_hooks, non_full_backward_hooks = [], []

/var/folders/mz/qfpvpvf550s039lrnxg70whh0000gn/T/ipykernel_11483/3789274317.py in forward(self, xb)
     29 
     30     def forward(self, xb): # xb - загруженная партия
---> 31         out = self.conv1(xb)
     32         out = self.conv2(out)
     33         out = self.res1(out) + out

/opt/homebrew/Cellar/jupyterlab/3.2.5/libexec/lib/python3.9/site-packages/torch/nn/modules/module.py in _call_impl(self, *input, **kwargs)
   1128         if not (self._backward_hooks или self._forward_hooks или self._forward_pre_hooks или _global_backward_hooks
   1129                 или _global_forward_hooks или _global_forward_pre_hooks):
-> 1130             return forward_call(*input, **kwargs)
   1131         # Не вызывать функции, когда используются jit
   1132         full_backward_hooks, non_full_backward_hooks = [], []

/opt/homebrew/Cellar/jupyterlab/3.2.5/libexec/lib/python3.9/site-packages/torch/nn/modules/container.py in forward(self, input)
    137     def forward(self, input):
    138         for module in self:
--> 139             input = module(input)
    140         return input
    141 

/opt/homebrew/Cellar/jupyterlab/3.2.5/libexec/lib/python3.9/site-packages/torch/nn/modules/module.py in _call_impl(self, *input, **kwargs)
   1128         if not (self._backward_hooks или self._forward_hooks или self._forward_pre_hooks или _global_backward_hooks
   1129                 или _global_forward_hooks или _global_forward_pre-hooks):
-> 1130             return forward_call(*input, **kwargs)
   1131         # Не вызывать функции, когда используются jit
   1132         full_backward_hooks, non_full_backward_hooks = [], []

/opt/homebrew/Cellar/jupyterlab/3.2.5/libexec/lib/python3.9/site-packages/torch/nn/modules/conv.py in forward(self, input)
    457 
    458     def forward(self, input: Tensor) -> Tensor:
--> 459         return self._conv_forward(input, self.weight, self.bias)
    460 
    461 class Conv3d(_ConvNd):

/opt/homebrew/Cellar/jupyterlab/3.2.5/libexec/lib/python3.9/site-packages/torch/nn/modules/conv.py in _conv_forward(self, input, weight, bias)
    453                             weight, bias, self.stride,
    454                             _pair(0), self.dilation, self.groups)
--> 455         return F.conv2d(input, weight, bias, self.stride,
    456                         self.padding, self.dilation, self.groups)
    457 

RuntimeError: Тип ввода (MPSFloatType) и тип веса (torch.FloatTensor) должны быть одинаковыми

MPS все еще ново, и я пытаюсь выяснить причину, любые предложения приветствуются,
код работает нормально, если устройство torch установлено на CPU – просто занимает много времени.

Спасибо,
Дип Камал Сингх

PS – этот вопрос впервые задавался здесь, я свяжусь с остальными.

Портирование любой модели с CPU на CUDA или MPS, скорее всего, потребует этого изменения. Я думаю, что общий ответ для этого будет следующим: помимо добавления изображений и меток на устройство, также добавьте вашу модель таким же образом. Пример ниже;

images=images.to(devc)
labels=labels.to(devc)
model = model.to(devc)

перед тем, как выполнить;
outputs = model(images)

Найдите похожий или связанный вопрос здесь: https://github.com/Mikubill/sd-webui-controlnet/issues/1649 и также на форумах pytorch.

Ответ или решение

Проблема, с которой вы столкнулись, связана с несовпадением типов данных входных данных и весов модели в контексте использования Metal Performance Shaders (MPS) на ваших устройствах Apple. Ошибка Input type (MPSFloatType) and weight type (torch.FloatTensor) should be the same возникает, когда вы пытаетесь выполнить операцию с тензорами, которые находятся на разных устройствах или имеют различные типы.

Анализ проблемы

Когда вы используете torch.device('mps'), это означает, что вы намереваетесь запускать вашу модель на графическом процессоре (GPU) при помощи MPS. Однако в процессе выполнения вашего кода тензоры, которые представляют входные данные или веса модели, могут оставаться на CPU, что приводит к возникновению вашей ошибки.

Решение проблемы

Чтобы устранить это несоответствие типов, необходимо убедиться, что все ваши данные находятся на том же устройстве. Для этого можно следовать следующим шагам:

  1. Перенос модели на MPS:
    Убедитесь, что ваша модель также находится на MPS. Это делается с помощью метода .to(device), где device равен torch.device('mps').

  2. Перенос входных данных и меток на MPS:
    Перед передачей данных в модель, вам также необходимо переместить входные данные и метки на то же устройство:

    device = torch.device('mps')
    model = model.to(device)
    
    # Внутри вашего метода валидации
    images, labels = batch
    images = images.to(device)
    labels = labels.to(device)
  3. Проверка типов тензоров:
    После выполнения указанных изменений, полезно проверить типы тензоров на каждом этапе, чтобы убедиться, что они совпадают. Используйте tensor.device или tensor.type() для отладки.

Пример исправленного кода

Вот как мог бы выглядеть исправленный метод validation_step в вашей модели:

def validation_step(self, batch):
    images, labels = batch
    images = images.to(device)  # Переносим изображения на MPS
    labels = labels.to(device)  # Переносим метки на MPS
    out = self(images)  # Генерация предсказаний
    loss = F.cross_entropy(out, labels)  # Вычисление потерь
    acc = accuracy(out, labels)  # Вычисление точности
    return {'val_loss': loss, 'val_accuracy': acc}

Заключение

Использование MPS для ускорения вычислений в PyTorch может быть эффективным, но требует внимательного управления устройствами. Следуя вышеописанным шагам, вы сможете устранить возникшую ошибку и успешно запустить вашу модель на графическом процессоре. Всегда проверяйте, что все тензоры задействованы на одном устройстве, чтобы избежать подобных конфликтов.

Если у вас возникнут дополнительные вопросы, не стесняйтесь искать помощь в сообществе фреймворка PyTorch или на специализированных форумах, таких как Stack Overflow или GitHub.

Оцените материал
Добавить комментарий

Капча загружается...