Tengo una lista de oraciones para las que estoy tratando de calcular la perplejidad, usando varios modelos usando este código:
from transformers import AutoModelForMaskedLM, AutoTokenizer import torch import numpy as np model_name = 'cointegrated/rubert-tiny' model = AutoModelForMaskedLM.from_pretrained(model_name).cuda() tokenizer = AutoTokenizer.from_pretrained(model_name) def score(model, tokenizer, sentence): tensor_input = tokenizer.encode(sentence, return_tensors='pt') repeat_input = tensor_input.repeat(tensor_input.size(-1)-2, 1) mask = torch.ones(tensor_input.size(-1) - 1).diag(1)[:-2] masked_input = repeat_input.masked_fill(mask == 1, tokenizer.mask_token_id) labels = repeat_input.masked_fill( masked_input != tokenizer.mask_token_id, -100) with torch.inference_mode(): loss = model(masked_input.cuda(), labels=labels.cuda()).loss return np.exp(loss.item()) print(score(sentence='London is the capital of Great Britain.', model=model, tokenizer=tokenizer)) # 4.541251105675365La mayoría de los modelos funcionan bien, pero algunas oraciones parecen arrojar un error:
RuntimeError: CUDA out of memory. Tried to allocate 10.34 GiB (GPU 0; 23.69 GiB total capacity; 10.97 GiB already allocated; 6.94 GiB free; 14.69 GiB reserved in total by PyTorch) If reserved memory is >> allocated memory try setting max_split_size_mb to avoid fragmentation. See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF
Lo cual tiene sentido porque algunos son muy largos. Entonces, lo que hice fue agregar algo como try, except RuntimeError, pass .
Esto pareció funcionar hasta alrededor de 210 oraciones, y luego solo muestra el error:
CUDA error: an illegal memory access was encountered CUDA kernel errors might be asynchronously reported at some other API call,so the stacktrace below might be incorrect. For debugging consider passing CUDA_LAUNCH_BLOCKING=1.
Encontré esto que tenía muchas discusiones e ideas, ¿algunas estaban relacionadas con posibles GPU defectuosas? Pero sé que mi GPU funciona como este código exacto funciona para otros modelos. Aquí también se habla sobre el tamaño del lote, por lo que pensé que potencialmente se relaciona con la liberación de memoria.
Intenté ejecutar torch.cuda.empty_cache() para liberar la memoria como aquí después de algunas épocas, pero no funcionó (arrojó el mismo error).
Actualización: filtré oraciones con una longitud superior a 550 y esto parece eliminar el CUDA error: an illegal memory access was encountered CUDA kernel errors might be asynchronously reported at some other API call,so the stacktrace below might be incorrect. For debugging consider passing CUDA_LAUNCH_BLOCKING=1. error.
Debe aplicar gc.collect() antes torch.cuda.empty_cache() . También extraigo el modelo de la CPU y luego elimino ese modelo y su punto de control. Pruebe lo que funciona para usted:
import gc model.cpu() del model, checkpoint gc.collect() torch.cuda.empty_cache()