onnxruntime으로 onnx 모델 추론 시 cuda 메모리 사용량을 측정하는 코드를 작성중입니다.
torch 모델을 추론 시에는 torch.cuda.memory_allocation() 함수로 측정할 수 있었으나, onnxruntime에서는 측정이 안되네요. 방법이 있을까요?
torch version: '2.0.1+cu117'
아래 코드는 기존에 사용하던 코드입니다.
start_event = torch.cuda.Event(enable_timing=True)
end_event = torch.cuda.Event(enable_timing=True)
for i in tqdm(range(num_iterations)):
torch.cuda.synchronize() # Wait for all kernels to finish
memory_usage_before = torch.cuda.memory_allocated()
start_event.record()
output_tensor = sess.run(None, {input_name: input_data})
end_event.record()
torch.cuda.synchronize() # Wait for all kernels to finish
memory_usage_after = torch.cuda.memory_allocated()
execution_time.append(start_event.elapsed_time(end_event)) # Get the elapsed time in milliseconds
memory_usage.append((memory_usage_after - memory_usage_before))
average_memory_usage = np.mean(memory_usage)
average_execution_time = np.mean(execution_time)
std_dev_execution_time = np.std(execution_time)```
아래 답변은 OpenAI의 GPT-4 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다.
안녕하세요, ojun.kwon님. PyTorch와 ONNX에 대한 질문 감사드립니다.
질문을 정리해보면, PyTorch에서는 torch.cuda.memory_allocated()를 사용하여 CUDA 메모리 사용량을 측정할 수 있지만, ONNX Runtime에서는 이와 같은 방법으로 메모리 사용량을 측정할 수 없어서 어떻게 해야 할지에 대한 질문으로 이해하였습니다.
ONNX Runtime은 PyTorch와는 다르게 자체적으로 CUDA 메모리 사용량을 측정하는 API를 제공하지 않습니다. 따라서, NVIDIA의 System Management Interface(nvidia-smi)를 사용하여 GPU 메모리 사용량을 측정하는 방법을 고려해볼 수 있습니다.
Python에서는 subprocess 모듈을 사용하여 nvidia-smi 명령을 실행하고 그 결과를 파싱하여 GPU 메모리 사용량을 얻을 수 있습니다. 아래는 그 예시입니다.
import subprocess
def get_gpu_memory():
_output_to_list = lambda x: x.decode('ascii').split('\n')[:-1]
ACCEPTABLE_AVAILABLE_MEMORY = 1024
COMMAND = "nvidia-smi --query-gpu=memory.free --format=csv"
memory_free_info = _output_to_list(subprocess.check_output(COMMAND.split()))[1:]
memory_free_values = [int(x.split()[0]) for i, x in enumerate(memory_free_info)]
print(memory_free_values)
get_gpu_memory()
위 코드는 현재 GPU의 사용 가능한 메모리를 출력합니다. 이를 통해 ONNX 모델 추론 전후의 메모리 차이를 계산하여 ONNX 모델이 사용하는 메모리를 측정할 수 있습니다.
하지만 이 방법은 다른 프로세스가 동시에 GPU를 사용하고 있지 않을 때만 정확한 결과를 제공합니다. 다른 프로세스가 GPU를 사용하고 있다면 그 프로세스가 사용하는 메모리 변화도 측정 결과에 포함되기 때문입니다.