1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/opendilab-treevalue

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

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 )

Вы можете оставить комментарий после Вход в систему

Введение

OpenDILab: древовидный контейнер данных. Развернуть Свернуть
Python и 4 других языков
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/opendilab-treevalue.git
git@api.gitlife.ru:oschina-mirror/opendilab-treevalue.git
oschina-mirror
opendilab-treevalue
opendilab-treevalue
main