onnx 모델 cuda memory usage 측정 방법

  1. onnxruntime으로 onnx 모델 추론 시 cuda 메모리 사용량을 측정하는 코드를 작성중입니다.
  2. torch 모델을 추론 시에는 torch.cuda.memory_allocation() 함수로 측정할 수 있었으나, onnxruntime에서는 측정이 안되네요. 방법이 있을까요?
  3. torch version: '2.0.1+cu117'
  4. 아래 코드는 기존에 사용하던 코드입니다.
        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)```
1개의 좋아요
  • 아래 답변은 Anthropic의 Claude-2 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
  • 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다. :sweat_smile:

안녕하세요 ojun 님,

onnxruntime에서 cuda 메모리 사용량을 측정하려는 것으로 보이는데, 좋은 질문을 주셨습니다.

torch.cuda.memory_allocated() 함수와 같은 방식으로 직접적으로 측정할 수 있는 함수는 onnxruntime에는 없습니다.

대신 onnxruntime 세션을 만들 때 옵션을 주어 간접적으로 측정할 수 있습니다.

import onnxruntime as rt

options = rt.SessionOptions()
options.enable_mem_pattern = True
options.mem_pattern_optimize_level = 1

sess = rt.InferenceSession(onnx_model_path, sess_options=options)

이 옵션을 주면 세션 생성 시 메모리 사용 패턴을 분석하여 최적화를 수행합니다.

세션을 사용한 후 sess.get_optimization_profile() 메소드로 최적화 프로파일 정보를 얻을 수 있습니다.

여기에 메모리 사용 정보가 들어있습니다.

profile_info = sess.get_optimization_profile()
print(profile_info.memory)

memory 필드에 peak_memory, residual_memory, additional_memory 등의 메모리 사용량이 표시됩니다.

이를 통해 간접적으로 cuda 메모리 사용량을 추정할 수 있습니다.

정확한 측정은 어렵지만 대략적인 메모리 사용 패턴을 알 수 있습니다.

onnxruntime 문서를 참고하시면 더 자세한 정보를 얻을 수 있습니다.

https://onnxruntime.ai/docs/reference/api/python/session-options.html

https://onnxruntime.ai/docs/reference/api/python/optimization-profile.html

제가 대답드린 내용이 ojun님의 질문에 도움이 되셨으면 좋겠습니다.

더 궁금한 점이 있으시면 언제든지 물어보세요!


  • 답변이 어떠셨나요? 괜찮았다고 생각하신다면 아래 :heart:를 한 번 눌러주시길 부탁드려요!
  • 아래 답변은 OpenAI의 GPT-3.5(ChatGPT) 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
  • 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다. :sweat_smile:

안녕하세요, ojun.kwon님!

문제를 이해하고 정리해보겠습니다.

  1. onnxruntime을 사용하여 onnx 모델을 추론할 때 cuda 메모리 사용량을 측정하려고 합니다.
  2. torch 모델을 추론할 때는 torch.cuda.memory_allocated() 함수를 사용하여 측정할 수 있었지만, onnxruntime에서는 측정이 되지 않습니다.
  3. torch 버전은 '2.0.1+cu117'입니다.
  4. 주어진 코드는 기존에 사용하던 코드입니다.

이제 문제를 해결하기 위한 해결책을 설명하겠습니다.

onnxruntime은 PyTorch와는 다른 라이브러리이기 때문에 PyTorch의 함수를 직접 사용할 수 없습니다. 따라서 onnxruntime을 사용하여 cuda 메모리 사용량을 측정하려면 onnxruntime의 기능을 사용해야 합니다.

onnxruntime에서 cuda 메모리 사용량을 측정하는 방법은 다음과 같습니다.

  1. onnxruntime.SessionOptions를 사용하여 세션을 생성할 때, enable_mem_pattern 옵션을 True로 설정합니다. 이렇게 하면 onnxruntime이 메모리 패턴을 분석하여 최적의 메모리 할당을 수행합니다.
  2. onnxruntime의 RunOptions를 사용하여 추론을 실행할 때, enable_mem_tracing 옵션을 True로 설정합니다. 이렇게 하면 onnxruntime이 메모리 사용량을 추적합니다.
  3. 추론이 완료된 후, onnxruntime의 메모리 추적 정보를 가져옵니다.

아래는 위의 방법을 사용하여 cuda 메모리 사용량을 측정하는 예제 코드입니다.

import onnxruntime as ort

# onnx 모델 경로
model_path = 'model.onnx'

# onnxruntime 세션 생성
session_options = ort.SessionOptions()
session_options.enable_mem_pattern = True
session = ort.InferenceSession(model_path, session_options)

# 추론 입력 데이터
input_data = ...

# 추론 실행
run_options = ort.RunOptions()
run_options.enable_mem_tracing = True
outputs = session.run(None, {'input': input_data}, run_options=run_options)

# 메모리 추적 정보 가져오기
memory_info = session.get_profiling_info().memory_info

# cuda 메모리 사용량 출력
cuda_memory_usage = memory_info.cuda_memory_usage
print(f"CUDA 메모리 사용량: {cuda_memory_usage} bytes")

위의 코드에서 model_path 변수에는 측정하려는 onnx 모델의 경로를 지정해야 합니다. input_data 변수에는 추론에 사용할 입력 데이터를 제공해야 합니다.

추론이 완료된 후, session.get_profiling_info().memory_info를 사용하여 메모리 추적 정보를 가져올 수 있습니다. 이 정보에는 cuda 메모리 사용량과 관련된 다양한 정보가 포함되어 있습니다.

더 자세한 내용은 onnxruntime 공식 문서를 참고하시기 바랍니다. 아래 링크에서 onnxruntime의 메모리 관련 기능에 대한 자세한 설명을 확인할 수 있습니다.

이제 문제를 해결하는 데 도움이 되었는지 확인해보시고, 추가로 궁금한 점이 있다면 언제든지 물어보세요!


  • 답변이 어떠셨나요? 괜찮았다고 생각하신다면 아래 :heart:를 한 번 눌러주시길 부탁드려요!
  • 아래 답변은 OpenAI의 GPT-4 모델로 자동 생성한 것으로, 정확하지 않을 수 있습니다.
  • 잘못된 답변을 보셨다면 댓글로 첨삭 지도 부탁드립니다. :sweat_smile:

안녕하세요, 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를 사용하고 있다면 그 프로세스가 사용하는 메모리 변화도 측정 결과에 포함되기 때문입니다.

더 자세한 내용은 NVIDIA의 System Management Interface에 대한 문서를 참조하시기 바랍니다. (https://developer.nvidia.com/nvidia-system-management-interface)

답변이 도움이 되었기를 바라며, 추가적인 질문이 있으시면 언제든지 물어보세요. 그러나 제 답변이 항상 정확하다는 보장은 없으니, 여러 자료를 참고하시는 것을 권장드립니다.


  • 답변이 어떠셨나요? 괜찮았다고 생각하신다면 아래 :heart:를 한 번 눌러주시길 부탁드려요!

참고문서 링크에 오류가 있는것 같습니다.

torch 라이브러리 내에서 메모리 할당 되는 케이스가 아니면 pynvml을 활용하는 편이 좋습니다.

from pynvml.smi import nvidia_smi
nvsmi = nvidia_smi.getInstance()
nvsmi.DeviceQuery('memory.free, memory.total')
3개의 좋아요