Запуск квантованной модели Pytorch на графическом процессоре CUDA

#python #machine-learning #pytorch

Вопрос:

Я в замешательстве по поводу того, можно ли запустить квантованную модель int8 на CUDA, или вы можете обучить квантованную модель только на CUDA с помощью fakequantise для развертывания на другом бэкэнде, таком как процессор.

Я хочу запустить модель на CUDA с реальными инструкциями int8 вместо поддельных инструкций float32 и наслаждаться повышением эффективности. Документы Pytorch странно неспецифичны в этом вопросе. Если возможно запустить квантованную модель на CUDA с другой структурой, например, TensorFlow я хотел бы знать.

Это код для подготовки моей квантованной модели (с использованием квантования после обучения). Модель является обычной CNN с nn.Conv2d и nn.Модули LeakyReLU и nn.MaxPool:

 model_fp = torch.load(models_dir net_file)  model_to_quant = copy.deepcopy(model_fp) model_to_quant.eval() model_to_quant = quantize_fx.fuse_fx(model_to_quant)  qconfig_dict = {"": torch.quantization.get_default_qconfig('qnnpack')}  model_prepped = quantize_fx.prepare_fx(model_to_quant, qconfig_dict) model_prepped.eval() model_prepped.to(device='cuda:0')  train_data = ImageDataset(img_dir, train_data_csv, 'cuda:0') train_loader = DataLoader(train_data, batch_size=32, shuffle=True, pin_memory=True)  for i, (input, _) in enumerate(train_loader):  if i gt; 1: break  print('batch', i 1, end='r')  input = input.to('cuda:0')  model_prepped(input)  

Это фактически квантовает модель:

 model_quantised = quantize_fx.convert_fx(model_prepped) model_quantised.eval()  

Это попытка запустить квантованную модель на CUDA и вызывает ошибку NotImplementedError, когда я запускаю ее на процессоре, она работает нормально:

 model_quantised = model_quantised.to('cuda:0') for i, _ in train_loader:  input = input.to('cuda:0')  out = model_quantised(input)  print(out, out.shape)  break  

В этом и заключается ошибка:

 Traceback (most recent call last):  File "/home/adam/Desktop/thesis/Ship Detector/quantisation.py", line 54, in lt;modulegt;  out = model_quantised(input)  File "/home/adam/.local/lib/python3.9/site-packages/torch/fx/graph_module.py", line 513, in wrapped_call  raise e.with_traceback(None) NotImplementedError: Could not run 'quantized::conv2d.new' with arguments from the 'QuantizedCUDA' backend.  This could be because the operator doesn't exist for this backend, or was omitted during the selective/custom build process (if using custom build).  If you are a Facebook employee using PyTorch on mobile, please visit https://fburl.com/ptmfixes for possible resolutions.  'quantized::conv2d.new' is only available for these backends: [QuantizedCPU, BackendSelect, Named, ADInplaceOrView, AutogradOther, AutogradCPU, AutogradCUDA, AutogradXLA, UNKNOWN_TENSOR_TYPE_ID, AutogradMLC, Tracer, Autocast, Batched, VmapMode].