onnxruntime/onnxruntime/core
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
..
codegen Run clang-format in CI (#15524) 2023-04-18 09:26:58 -07:00
common Run clang-format in CI (#15524) 2023-04-18 09:26:58 -07:00
dll Run clang-format in CI (#15524) 2023-04-18 09:26:58 -07:00
dlpack Run clang-format in CI (#15524) 2023-04-18 09:26:58 -07:00
eager
flatbuffers Minimal Build for On-Device Training (#16326) 2023-06-22 12:27:23 -07:00
framework [C#, CPP] Introduce Float16/BFloat16 support and tests for C#, C++ (#16506) 2023-07-14 10:46:52 -07:00
graph Bug fix for nested control flow ops for TRT EP (#16343) 2023-07-23 16:16:17 -07:00
language_interop_ops Run clang-format in CI (#15524) 2023-04-18 09:26:58 -07:00
mlas Fix Mac M1 build (#16763) 2023-07-20 18:24:57 -07:00
optimizer Fix slice upstream - Incompatible dimensions (#16818) 2023-07-25 08:21:46 +08:00
platform Fix builds (#16646) 2023-07-11 19:21:25 -07:00
providers Improve TreeNodeElementId hash function (#16459) 2023-07-25 14:25:50 +02:00
quantization Refactor prepack buffer code (#16280) 2023-06-08 14:42:02 -07:00
session Bug fix for nested control flow ops for TRT EP (#16343) 2023-07-23 16:16:17 -07:00
util Fix Mac M1 build (#16763) 2023-07-20 18:24:57 -07:00