onnxruntime/onnxruntime
Luis Rios feeb0b50f9
Improve TreeNodeElementId hash function (#16459)
### Description
This PR improves `TreeNodeElementId` hash function by employing [Elegant
Pairing function](http://szudzik.com/ElegantPairing.pdf). In few works,
Elegant Pairing function maps two non−negative integers to a
non−negative integer that is uniquely associated with that pair. This
drastically reduces the collision and therefore reduces the time
required to create a session in order to use a large tree ensemble
model.

### Motivation and Context
We use ONNX runtime to serve our models as part of Triton backend. We
noticed that it was taking around 2 minutes to load a model which is a
large tree ensemble model (around 5k trees with around 3 millions nodes
in total). After investigating the issue, it was clear that the
`TreeNodeElementId` hash function wasn't being able to map keys to
buckets of C++ `unordered_map` without a significant amount of
collisions (in same cases 700 items per bucket).

The following picture shows graphically the improvement obtained by the
proposed change. We used the `onnx_test_runner` command.

![flamegraph](https://github.com/microsoft/onnxruntime/assets/3594678/2588e87c-125b-4a4b-8f03-55e00ae25e08)

#### Before
```
$> time ./onnx_test_runner -v ~/folder_with_model
result:
	Models: 1
	Total test cases: 0
		Succeeded: 0
		Not implemented: 0
		Failed: 0
	Stats by Operator type:
		Not implemented(0):
		Failed:
Failed Test Cases:

real	0m55.695s
user	0m52.919s
sys	0m0.760s
```

#### After
```
$> time ./onnx_test_runner -v ~/folder_with_model
result:
	Models: 1
	Total test cases: 0
		Succeeded: 0
		Not implemented: 0
		Failed: 0
	Stats by Operator type:
		Not implemented(0):
		Failed:
Failed Test Cases:

real	0m17.152s
user	0m14.318s
sys	0m0.619s
```
2023-07-25 14:25:50 +02:00
..
contrib_ops [ROCm] Generalize FastGeLU (#16623) 2023-07-18 11:23:12 +08:00
core Improve TreeNodeElementId hash function (#16459) 2023-07-25 14:25:50 +02:00
python fix: add missing nullptr of SessionOptions V2 (#16794) 2023-07-24 15:17:11 -07:00
test update onnxruntime_perftest's README.md as vitisai is supported on v1.15.1 (#16827) 2023-07-25 13:39:26 +02:00
tool/etw Run clang-format in CI (#15524) 2023-04-18 09:26:58 -07:00
wasm [js/web] enable ONNX Runtime Web error messages in JS (#16335) 2023-06-15 09:45:41 -07:00
__init__.py ExecutionProvider API refactor - move allocator from EP level to SessionState level and indexed by OrtDevice (#15833) 2023-06-19 17:44:45 -07:00
ReformatSource.ps1 Run clang-format in CI (#15524) 2023-04-18 09:26:58 -07:00
ReformatSourcePython.bat
VSCodeCoverage.runsettings