- ONNX 지원
- 포맷 변환
- 자동 데이터 유형 변환
- 모델 생성
- 모델 실행
- 전략 테스터에서 실행
- OnnxCreate
- OnnxCreateFromBuffer
- OnnxRelease
- OnnxRun
- OnnxGetInputCount
- OnnxGetOutputCount
- OnnxGetInputName
- OnnxGetOutputName
- OnnxGetInputTypeInfo
- OnnxGetOutputTypeInfo
- OnnxSetInputShape
- OnnxSetOutputShape
- 데이터 구조
데이터 구조
다음 데이터 구조는 ONNX 모델 작업에 사용됩니다:
OnnxTypeInfo #
구조는 ONNX 모델의 input또는output parameter의 유형을 설명합니다.
struct OnnxTypeInfo
|
텐서(ONNX_TYPE_TENSOR)만 input으로 사용할 수 있습니다. 이 경우 OnnxTypeInfo::tensor 필드만 값들로 채워지고 다른 필드(map 및 sequence)는 정의되지 않습니다.
세 가지 OnnxTypeInfo 유형(ONNX_TYPE_TENSOR, ONNX_TYPE_MAP 또는 ONNX_TYPE_SEQUENCE) 중 하나만 input으로 사용할 수 있습니다. 해당 하위 구조(OnnxTypeInfo::tensor, OnnxTypeInfo::map 또는 OnnxTypeInfo::sequence)는 유형에 따라 채워집니다.
구조는 다음의 텐서를 설명합니다. ONNX 모델의 input또는output parameter
struct OnnxTensorTypeInfo
|
OnnxMapTypeInfo #
구조는 ONNX 모델의 출력 매개변수에서 얻은 지도를 설명합니다.
struct OnnxMapTypeInfo
|
OnnxSequenceTypeInfo #
구조는 ONNX 모델의 출력 매개변수에서 얻은 시퀀스를 설명합니다.
struct OnnxSequenceTypeInfo
|
ENUM_ONNX_TYPE #
ENUM_ONNX_TYPE 열거형은 모델 매개변수의 유형에 대해 설명합니다.
ID |
설명 |
|---|---|
ONNX_TYPE_UNKNOWN |
Unknown |
ONNX_TYPE_TENSOR |
Tensor |
ONNX_TYPE_SEQUENCE |
Sequence |
ONNX_TYPE_MAP |
Map |
ONNX_TYPE_OPAQUE |
Abstract (opaque) |
ONNX_TYPE_SPARSETENSOR |
Sparse tensor |
ENUM_ONNX_DATA_TYPE #
ENUM_ONNX_DATA_TYPE 열거형은 사용된 데이터 유형에 대해 설명합니다.
ID |
설명 |
|---|---|
ONNX_DATA_TYPE_UNDEFINED |
Undefined |
ONNX_DATA_TYPE_FLOAT |
float |
ONNX_DATA_TYPE_INT8 |
8-bit int |
ONNX_DATA_TYPE_UINT16 |
16-bit uint |
ONNX_DATA_TYPE_INT16 |
16-bit int |
ONNX_DATA_TYPE_INT32 |
32-bit int |
ONNX_DATA_TYPE_INT64 |
64-bit int |
ONNX_DATA_TYPE_STRING |
string |
ONNX_DATA_TYPE_BOOL |
bool |
ONNX_DATA_TYPE_FLOAT16 |
16-bit float |
ONNX_DATA_TYPE_DOUBLE |
double |
ONNX_DATA_TYPE_UINT32 |
32-bit uint |
ONNX_DATA_TYPE_UINT64 |
64-bit uint |
ONNX_DATA_TYPE_COMPLEX64 |
64-bit complex number |
ONNX_DATA_TYPE_COMPLEX128 |
128-bit complex number |
ONNX_DATA_TYPE_BFLOAT16 |
16-bit bfloat (Brain Floating Point) |
ENUM_ONNX_FLAGS #
ENUM_ONNX_FLAGS 열거는 모델 실행 모드에 대해 설명합니다.
ID |
설명 |
|---|---|
ONNX_LOGLEVEL_VERBOSE |
모든 메세지를 로그합니다 |
ONNX_LOGLEVEL_INFO |
정보 메시지, 경고 및 오류를 기록합니다(이 플래그는 ONNX_DEBUG_LOGS를 대체합니다) |
ONNX_LOGLEVEL_WARNING |
경고 및 오류를 로그합니다(기본값 수준) |
ONNX_LOGLEVEL_ERROR |
에러만 로그합니다 |
ONNX_NO_CONVERSION |
자동 변환을 비활성화하고 사용자 데이터를 그대로 사용 |
ONNX_COMMON_FOLDER |
Common\Files 폴더에서 모델 파일을 로드합니다; 값은FILE_COMMON flag와 같습니다. |
ONNX_USE_CPU_ONLY |
CPU만 사용하여 ONNX 모델 실행 |
ONNX_GPU_DEVICE_0 |
인덱스가 0인 CUDA 장치(기본값) |
ONNX_GPU_DEVICE_1 |
인덱스가 1*인 CUDA 장치 |
ONNX_GPU_DEVICE_2 |
인덱스가 2*인 CUDA 장치 |
ONNX_GPU_DEVICE_3 |
인덱스가 3*인 CUDA 장치 |
ONNX_GPU_DEVICE_4 |
인덱스가 4*인 CUDA 장치 |
ONNX_GPU_DEVICE_5 |
인덱스가 5*인 CUDA 장치 |
ONNX_GPU_DEVICE_6 |
인덱스가 6*인 CUDA 장치 |
ONNX_GPU_DEVICE_7 |
인덱스가 7*인 CUDA 장치 |
ONNX_ENABLE_PROFILING |
ONNX 모델 프로파일링을 활성화 |
* ONNX_GPU_DEVICE_N 형식의 플래그는 CUDA 지원 GPU가 2개 이상 있는 시스템에서 사용해야 합니다. 여러 GPU 선택 플래그가 지정된 경우 인덱스가 가장 낮은 장치가 사용됩니다.
존재하지 않는 장치 인덱스를 지정하면 GPU가 자동으로 선택됩니다.
ONNX 프로파일링
ONNX_ENABLE_PROFILING 플래그는 ONNX 모델 실행의 프로파일링을 활성화합니다. 이 플래그가 설정되면 프로파일링 보고서 파일이 <data_folder>/MQL5/Files/OnnxProfileReports 디렉터리에 생성됩니다.
파일 이름의 형식은 <module_name>_date_time.json입니다.
<module_name>은 MQL 프로그램 EX5 파일의 이름입니다.
파일에는 다음을 포함하여 JSON 형식의 자세한 ONNX 모델 실행 프로파일링 보고서가 포함되어 있습니다:
- 세션 로딩 및 초기화 시간;
- 개별 그래프 노드(Conv, Relu, MaxPool, Gemm 등)의 실행 시간;
- 사용된 실행 공급자(예: CUDAExecutionProvider);
- 입력 및 출력 텐서 크기 정보;
- 스레드 스케줄링 통계.
보고서 데이터 프로파일링의 예는 다음과 같습니다:
{"cat" : "Session","pid" :34368,"tid" :39520,"dur" :698,"ts" :11,"ph" : "X","name" :"model_loading_array","args" : {}},
|
ONNX 프로파일링에 대한 추가 정보:: https://onnxruntime.ai/docs/performance/tune-performance/profiling-tools.html
ONNX 모델 작업할 때 배열 변환
머신 러닝 작업에 항상 더 높은 계산 정확도가 필요한 것은 아닙니다. 계산 속도를 높이기 위해 일부 모델은 Float16 및 심지어 Float8과 같은 정밀도가 낮은 데이터 유형을 사용하기도 합니다. 사용자가 관련 데이터를 모델에 입력할 수 있도록 MQL5는 표준 MQL5 유형을 특수 FP16 및 FP8 유형으로 변환하는 네 가지 특수 함수를 제공합니다.
함수 |
액션 |
|---|---|
float 또는 double 유형의 배열을 주어진 형식의 ushort 유형의 배열에 복사합니다 |
|
float 또는 double 유형의 배열을 지정된 형식의 uchar 유형의 배열에 복사합니다 |
|
ushort 유형의 배열을 주어진 형식의 float 또는 double 유형의 배열로 복사합니다 |
|
uchar 유형의 배열을 지정된 형식의 float 또는 double 유형의 배열로 복사합니다 |
이러한 배열 변환 함수는 아래 열거에 지정된 특수 형식을 사용합니다.
ENUM_FLOAT16_FORMAT #
ENUM_FLOAT16_FORMAT 열거형은 두 가지 FP16 유형 형식을 설명합니다.
ID |
설명 |
|---|---|
FLOAT_FP16 |
표준 16비트 형식, half라고도 함 |
FLOAT_BFP16 |
특수 브레인 부동 소수점 형식 |
이러한 각 형식에는 장점과 제한 사항이 있습니다. FLOAT16은 더 높은 정확도를 제공하지만 더 많은 저장 공간과 계산 리소스가 필요합니다. 반면 BFLOAT16은 데이터 처리에 더 높은 성능과 효율성을 제공하지만 정확도가 떨어질 수 있습니다.
ENUM_FLOAT8_FORMAT #
ENUM_FLOAT8_FORMAT 열거형은 네 가지 FP8 유형 형식을 설명합니다.
FP8(8비트 부동 소수점)은 부동 소수점 자리를 나타내는 데 사용되는 데이터 유형 중 하나입니다. FP8에서 각 숫자는 8개의 데이터 비트로 표시되며 일반적으로 부호, 지수 및 가수의 세 가지 구성 요소로 나뉩니다. 이 형식은 정확성과 저장 효율성 사이의 균형을 제공하므로 메모리 용량과 계산 효율성이 필요한 애플리케이션에 적합합니다.
ID |
설명 |
|---|---|
FLOAT_FP8_E4M3FN |
8비트 부동 소수점 자리 숫자, 지수용 4비트, 가수용 3비트. 일반적으로 계수로 사용됩니다. |
FLOAT_FP8_E4M3FNUZ |
8비트 부동 소수점 자리 숫자, 지수용 4비트, 가수용 3비트. NaN을 지원하고 음의 0과 Inf를 지원하지 않습니다. 일반적으로 계수로 사용됩니다. |
FLOAT_FP8_E5M2FN |
8비트 부동 소수점 숫자, 지수용 5비트, 가수용 2비트. NaN과 Inf 지원. 일반적으로 기울기에 사용 |
FLOAT_FP8_E5M2FNUZ |
8비트 부동 소수점 숫자, 지수용 5비트, 가수용 2비트. NaN을 지원하고 음의 0과 Inf를 지원하지 않습니다. 기울기에도 사용. |
FP8의 주요 장점 중 하나는 대규모 데이터 세트 처리의 효율성입니다. FP8은 간결한 숫자 표현을 사용하여 메모리의 양을 줄이고 계산을 가속화합니다. 이는 대규모 데이터 세트를 자주 처리하는 기계 학습 및 인공 지능 애플리케이션에서 특히 중요합니다.