README-extra.md
February 16, 2024 ยท View on GitHub
This portable CM script provides a unified API and CLI to benchmark ONNX models using the MLPerf loadgen. It measures performance without accuracy using randomly generated inputs. If you need accuracy too, please check official CM automation for MLPerf inference.
Development status
- [20240214] ONNX runtime (CPU & GPU) is connected with LoadGen and tested on Ubuntu, Windows and MacOS. See sources.
Prerequisites
Install CM with automation recipes
Install MLCommons CM and pull CM repository with portable automation scripts to benchmark ML Systems:
pip install cmind
cm pull repo mlcommons@ck
Clean CM cache
If you want a "clean" environment, you may want to clean your CM cache as follows:
cm rm cache -f
Set up CM virtual environment
Click if you want to use Python virtual environment
We suggest you to install a python virtual environment via CM though it's not strictly necessary (CM can automatically detect and reuse your Python installation and environments):
cm run script "install python-venv" --name=loadgen
You can also install a specific version of Python on your system via:
cm run script "install python-venv" --name=loadgen --version=3.10.7
By default, CM will be asking users to select one from all detected and installed Python versions including the above one, any time a script with python dependency is run. To avoid that, you can set up the following environment variable with the name of the current virtual environment:
export CM_SCRIPT_EXTRA_CMD="--adr.python.name=loadgen"
The --adr flag stands for "Add to all Dependencies Recursively" and will find all sub-dependencies on other CM scripts
Install dependencies via CM (optional)
Click if you want to install specific versions of dependencies
You can skip this sub-section if you want CM to automatically detect already installed ONNX runtime on your system. Otherwise, follow the next steps to install the latest or specific version of ONNX runtime.
Download LoadGen sources from MLPerf inference benchmark
cm run script "get mlperf inference src" --version=r3.1
Install MLPerf LoadGen
We can now install loadgen via CM while forcing compiler dependency to GCC:
cm run script "get mlperf loadgen"
ONNX, CPU
cm run script "get generic-python-lib _onnxruntime"
or
cm run script "get generic-python-lib _onnxruntime" --version=1.13.1
or
cm run script "get generic-python-lib _onnxruntime" --version_min=1.10.0
Benchmark standard MLPerf model
You can use CM variations prefixed by _ to benchmark an official MLPerf model
(_resnet50 or _retinanet):
cm run script "python app loadgen-generic _onnxruntime _retinanet" --samples=5
cmr "python app loadgen-generic _onnxruntime _resnet50"
Normally, you should see the following performance report from the loadgen:
Click to open
2022-12-06 16:51:39,279 INFO MainThread - __main__ main: Model: /home/gfursin/CM/repos/local/cache/9c825a0a06fb48e2/resnet50_v1.onnx
2022-12-06 16:51:39,279 INFO MainThread - __main__ main: Runner: inline, Concurrency: 4
2022-12-06 16:51:39,279 INFO MainThread - __main__ main: Results: results/resnet50_v1.onnx/inline
2022-12-06 16:51:39,279 INFO MainThread - __main__ main: Test Started
2022-12-06 16:51:39,399 INFO MainThread - loadgen.harness load_query_samples: Loaded 100 samples
2022-12-06 16:51:55,723 INFO MainThread - loadgen.harness issue_query: Queries issued 550
2022-12-06 16:51:55,725 INFO MainThread - loadgen.harness flush_queries: Queries flushed
2022-12-06 16:51:55,731 INFO MainThread - loadgen.harness unload_query_samples: Unloaded samples
================================================
MLPerf Results Summary
================================================
SUT name : PySUT
Scenario : Offline
Mode : PerformanceOnly
Samples per second: 33.6903
Result is : VALID
Min duration satisfied : Yes
Min queries satisfied : Yes
Early stopping satisfied: Yes
================================================
Additional Stats
================================================
Min latency (ns) : 16325180169
Max latency (ns) : 16325180169
Mean latency (ns) : 16325180169
50.00 percentile latency (ns) : 16325180169
90.00 percentile latency (ns) : 16325180169
95.00 percentile latency (ns) : 16325180169
97.00 percentile latency (ns) : 16325180169
99.00 percentile latency (ns) : 16325180169
99.90 percentile latency (ns) : 16325180169
================================================
Test Parameters Used
================================================
samples_per_query : 550
target_qps : 50
target_latency (ns): 0
max_async_queries : 1
min_duration (ms): 10000
max_duration (ms): 0
min_query_count : 1
max_query_count : 0
qsl_rng_seed : 0
sample_index_rng_seed : 0
schedule_rng_seed : 0
accuracy_log_rng_seed : 0
accuracy_log_probability : 0
accuracy_log_sampling_target : 0
print_timestamps : 0
performance_issue_unique : 0
performance_issue_same : 0
performance_issue_same_index : 0
performance_sample_count : 100
No warnings encountered during test.
No errors encountered during test.
2022-12-06 16:51:55,753 INFO MainThread - __main__ main: Observed QPS: 33.6903
2022-12-06 16:51:55,753 INFO MainThread - __main__ main: Result: VALID
2022-12-06 16:51:55,753 INFO MainThread - __main__ main: Test Completed
- Running postprocess ...
- running time of script "app,loadgen,generic,loadgen-generic,python": 370.87 sec.
Benchmark custom model
You can also specify any custom onnx model file as follows:
cm run script "python app loadgen-generic _onnxruntime" --modelpath=<CUSTOM_MODEL_FILE_PATH>
Benchmark Hugging Face model
cmr "python app loadgen-generic _onnxruntime _custom _huggingface _model-stub.ctuning/mlperf-inference-bert-onnx-fp32-squad-v1.1" --adr.hf-downloader.model_filename=model.onnx
See more examples to download Hugging Face models via CM here.
Benchmark using ONNX CUDA
cm rm cache -f
cmr "python app loadgen-generic _onnxruntime _cuda _retinanet" --quiet
cmr "python app loadgen-generic _onnxruntime _cuda _custom _huggingface _model-stub.ctuning/mlperf-inference-bert-onnx-fp32-squad-v1.1" --adr.hf-downloader.model_filename=model.onnx
These cases worked on Windows and Linux but may require GPU with > 8GB memory:
cmr "python app loadgen-generic _onnxruntime _cuda _custom _huggingface _model-stub.steerapi/Llama-2-7b-chat-hf-onnx-awq-w8" --adr.hf-downloader.model_filename=onnx/decoder_model_merged_quantized.onnx,onnx/decoder_model_merged_quantized.onnx_data --samples=2
cmr "python app loadgen-generic _onnxruntime _cuda _custom _huggingface _model-stub.alpindale/Llama-2-13b-ONNX" --adr.hf-downloader.model_filename=FP32/LlamaV2_13B_float32.onnx --adr.hf-downloader.full_subfolder=FP32 --samples=2
cmr "python app loadgen-generic _onnxruntime _cuda _custom _huggingface _model-stub.Intel/gpt-j-6B-int8-static" --adr.hf-downloader.model_filename=model.onnx --adr.hf-downloader.full_subfolder=. --samples=2
TBD: some cases that are not yet fully supported (data types, input mismatch, etc):
cmr "python app loadgen-generic _onnxruntime _custom _huggingface _model-stub.runwayml/stable-diffusion-v1-5" --adr.hf-downloader.revision=onnx --adr.hf-downloader.model_filename=unet/model.onnx,unet/weights.pb --samples=2
cmr "python app loadgen-generic _onnxruntime _cuda _custom _huggingface _model-stub.microsoft/Mistral-7B-v0.1-onnx" --adr.hf-downloader.model_filename=Mistral-7B-v0.1.onnx,Mistral-7B-v0.1.onnx.data --samples=2
cmr "python app loadgen-generic _onnxruntime _cuda _custom _huggingface _model-stub.alpindale/Llama-2-7b-ONNX" --adr.hf-downloader.model_filename=FP16/LlamaV2_7B_float16.onnx --adr.hf-downloader.full_subfolder=FP16 --samples=2
Other variations and flags:
You can obtain help about flags and variations from CMD:
cm run script "python app loadgen-generic" --help
Available variations:
_cpu
_cuda
_custom
_custom,huggingface
_huggingface
_model-stub.#
_onnxruntime
_pytorch
_resnet50
_retinanet
Available flags mapped to environment variables:
--concurrency -> --env.CM_MLPERF_CONCURRENCY
--ep -> --env.CM_MLPERF_EXECUTION_PROVIDER
--execmode -> --env.CM_MLPERF_EXEC_MODE
--interop -> --env.CM_MLPERF_INTEROP
--intraop -> --env.CM_MLPERF_INTRAOP
--modelpath -> --env.CM_ML_MODEL_FILE_WITH_PATH
--output_dir -> --env.CM_MLPERF_OUTPUT_DIR
--runner -> --env.CM_MLPERF_RUNNER
--samples -> --env.CM_MLPERF_LOADGEN_SAMPLES
--scenario -> --env.CM_MLPERF_LOADGEN_SCENARIO
Running this app via Docker
cm docker script "python app loadgen-generic _onnxruntime _custom _huggingface _model-stub.ctuning/mlperf-inference-bert-onnx-fp32-squad-v1.1" --adr.hf-downloader.model_filename=model.onnx --samples=2 --output_dir=new_results --docker_cm_repo=ctuning@mlcommons-ck
Tuning CPU performance via CM experiment
cm run experiment --tags=loadgen,python,llama2 -- cmr script "python app loadgen-generic _onnxruntime _cuda _custom _huggingface _model-stub.steerapi/Llama-2-7b-chat-hf-onnx-awq-w8" --adr.hf-downloader.model_filename=onnx/decoder_model_merged_quantized.onnx,onnx/decoder_model_merged_quantized.onnx_data --samples=2 --intraop={{CM_OPT_INTRAOP{[1,2,4]}}} --interop={{CM_OPT_INTEROP{[1,2,4]}}} --quiet
cm run experiment --tags=loadgen,python,llama2 -- cmr "python app loadgen-generic _onnxruntime" --modelpath={PATH TO ONNX MODEL} --samples=2 --intraop={{CM_OPT_INTRAOP{[1,2,4]}}} --interop={{CM_OPT_INTEROP{[1,2,4]}}} --quiet