TreeValue — это обобщённая древовидная структура данных, разработанная в основном участниками проекта OpenDILab.
Почти все операции могут быть поддержаны в виде деревьев удобным способом для упрощения обработки структуры, когда вычисления основаны на деревьях.
Вы можете просто установить его с помощью командной строки pip с официального сайта PyPI.
pip install treevalue
Для получения дополнительной информации об установке вы можете обратиться к руководству по установке.
Подробная документация размещена на сайте https://opendilab.github.io/treevalue.
Сейчас доступна только английская версия, китайская документация всё ещё находится в разработке.
Вы можете легко создать объект значения дерева на основе FastTreeValue.
from treevalue import FastTreeValue
if __name__ == '__main__':
t = FastTreeValue({
'a': 1,
'b': 2.3,
'x': {
'c': 'str',
'd': [1, 2, None],
'e': b'bytes',
}
})
print(t)
Результат должен быть:
<FastTreeValue 0x7f6c7df00160 keys: ['a', 'b', 'x']>
├── 'a' --> 1
├── 'b' --> 2.3
└── 'x' --> <FastTreeValue 0x7f6c81150860 keys: ['c', 'd', 'e']>
├── 'c' --> 'str'
├── 'd' --> [1, 2, None]
└── 'e' --> b'bytes'
И структура t должна выглядеть так:
Предоставляется не только видимая древовидная структура, но и обширная поддержка операций. Вы можете просто поместить объекты (например, torch.Tensor или любые другие типы) сюда и просто вызывать их методы, например:
import torch
from treevalue import FastTreeValue
t = FastTreeValue({
'a': torch.rand(2, 5),
'x': {
'c': torch.rand(3, 4),
}
})
print(t) **Перевод текста:**
<FastTreeValue 0x7f8c069346a0> ├── a --> тензор([[0.3606, 0.2583, 0.3843, 0.8611, 0.5130], [0.0717, 0.1370, 0.1724, 0.7627, 0.7871]]) └── x --> <FastTreeValue 0x7f8ba6130f40> └── c --> тензор([[0.2320, 0.6050, 0.6844, 0.3609], [0.0084, 0.0816, 0.8740, 0.3773], [0.6523, 0.4417, 0.6413, 0.8965]])
print(t.shape) # property access <FastTreeValue 0x7f8c06934ac0> ├── a --> torch.Size([2, 5]) └── x --> <FastTreeValue 0x7f8c069346d0> └── c --> torch.Size([3, 4])
print(t.sin()) # method call <FastTreeValue 0x7f8c06934b80> ├── a --> тензор([[0.3528, 0.2555, 0.3749, 0.7586, 0.4908], [0.0716, 0.1365, 0.1715, 0.6909, 0.7083]]) └── x --> <FastTreeValue 0x7f8c06934b20> └── c --> тензор([[0.2300, 0.5688, 0.6322, 0.3531], [0.0084, 0.0816, 0.7669, 0.3684], [0.6070, 0.4275, 0.5982, 0.7812]])
print(t.reshape((2, -1))) # method with arguments <FastTreeValue 0x7f8c06934b80> ├── a --> тензор([[0.3606, 0.2583, 0.3843, 0.8611, 0.5130], [0.0717, 0.1370, 0.1724, 0.7627, 0.7871]]) └── x --> <FastTreeValue 0x7f8c06934b20> └── c --> тензор([[0.2320, 0.6050, 0.6844, 0.3609, 0.0084, 0.0816], [0.8740, 0.3773, 0.6523, 0.4417, 0.6413, 0.8965]])
print(t[:, 1:-1]) # index operator <FastTreeValue 0x7f8ba5c8eca0> ├── a --> тензор([[0.2583, 0.3843, 0.8611], [0.1370, 0.1724, 0.7627]]) └── x --> <FastTreeValue 0x7f8ba5c8ebe0> └── c --> тензор([[0.6050, 0.6844], [0.0816, 0.8740], [0.4417, 0.6413]])
print(1 + (t - 0.8) ** 2 * 1.5) # math operators <FastTreeValue 0x7fdfa5836b80> ├── a --> тензор([[1.6076, 1.0048, 1.0541, 1.3524, 1.0015], [1.0413, 1.8352, 1.2328, 1.7904, 1.0088]]) └── x --> <FastTreeValue 0x7fdfa5836880> └── c --> тензор([[1.1550, 1.0963, 1.3555, 1.2030], [1.0575, 1.4045, 1.0041, 1.0638], [1.0782, 1.0037, 1.5075, 1.0658]])
| --------------------- | -------------------|
| | **tree_map** | (Not Implemented) | **tree_flatten** | **tree_unflatten** | **tree_leaves** | **tree_structure** |
| jax pytree (https://github.com/google/jax) | 4,67 мкс ± 184 нс | — | 1,29 мкс ± 27,2 нс | 742 нс ± 5,82 нс | 1,29 мкс ± 22 нс | 1,27 мкс ± 16,5 нс |
| | flatten + all | flatten + reduce | flatten + reduce(with init) | rise(given structure) | rise(automatic structure) |
|----------------------------------------------------------| :-----------: | :--------------: | :-------------------------: | :-------------------: | :-----------------------: |
| treevalue (https://github.com/opendilab/treevalue) | **425 нс ± 9,33 нс** | **702 нс ± 5,93 нс** | **793 нс ± 13,4 нс** | **9,14 мкс ± 129 нс** | **11,5 мкс ± 182 нс** |
| | **tree_all** | **tree_reduce** | tree_reduce(with init) | tree_transpose | (Not Implemented)|
| jax pytree (https://github.com/google/jax) | 1,47 мкс ± 37 нс | 1,88 мкс ± 27,2 нс| 1,91 мкс ± 47,4 нс | 10 мкс ± 117 нс | —|
Это сравнение между dm-tree, jax-libtree и нами с операциями flatten и mapping (**чем меньше значение, тем меньше времени требуется и тем быстрее выполняется операция**).
*Сравнение времени выполнения операции flatten.*
*Сравнение времени выполнения операции mapping.*
Следующая таблица представляет результаты сравнения производительности с tianshou Batch (https://github.com/thu-ml/tianshou).
| | get | set | init | deepcopy | stack | cat | split |
| -----------------------------------------------------------|----:|----:|-----:|---------|-------|-----|------|
| treevalue (https://github.com/opendilab/treevalue) | 51,6 нс ± 0,609 нс | **64,4 нс ± 0,564 нс** | **750 нс ± 14,2 нс** | **88,9 мкс ± 887 нс** | **50,2 мкс ± 771 нс** | **40,3 мкс ± 1,08 мкс** | **62 мкс ± 1,2 мкс** |
| tianshou Batch (https://github.com/thu-ml/tianshou) | **43,2 нс ± 0,698 нс** | 396 нс ± 8,99 нс | 11,1 мкс ± 277 нс | 89 мкс ± 1,42 мкс | 119 мкс ± 1,1 мкс | 194 мкс ± 1,81 мкс | 653 мкс ± 17,8 мкс |
И это сравнение между tianshou Batch и нами, с операциями cat, stack и split (**чем меньше значение, тем меньше времени требуется и тем быстрее выполняется операция**).
*Сравнение времени выполнения операции cat.*
*Сравнение времени выполнения операции stack.*
*Сравнение времени выполнения операции split.*
Тестовый код можно найти здесь:
* Сравнение с dm-tree (https://github.com/opendilab/treevalue/blob/main/test/compare/deepmind/test_dm_tree.py).
* Сравнение с jax-libtree (https://github.com/opendilab/treevalue/blob/main/test/compare/jax/test_jax.py).
* Сравнение с tianshou Batch (https://github.com/opendilab/treevalue/blob/main/test/compare/tianshou/test_tianshou_batch.py).
## Расширение
Если вам нужно перевести объект treevalue в исполняемый исходный код, вы можете использовать плагин potc-treevalue с командой установки ниже.
```shell
pip install potc-treevalue
Или просто установите его вместе с самим treevalue.
pip install treevalue[potc]
В potc вы можете перевести объекты в исполняемый код Python, который впоследствии может быть загружен интерпретатором Python, как показано на следующем графике. Для получения дополнительной информации вы можете обратиться к:
Мы ценим любой вклад в улучшение treevalue, как логический, так и системный дизайн. Дополнительную информацию можно найти в CONTRIBUTING.md.
Пользователи также могут присоединиться к нашему каналу связи в Slack или связаться с ведущим разработчиком HansBug для более подробного обсуждения.
Treevalue выпущена под лицензией Apache 2.0.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )