Как нейросеть запускается в TouchDesigner
Где считать модель: встроенный оператор, Python в процессе TouchDesigner с tdPyEnvManager и Thread Manager, отдельный процесс или сервис. Цена каждого и официальный TDDepthAnything как шаблон.
Сначала решают, где модель будет считаться, — от этого зависят задержка и судьба шоу при её падении.
| Способ | Задержка | Риск для шоу | Сложность |
|---|---|---|---|
| Встроенный оператор | Минимальная | Низкий | Никакой |
| Python внутри TouchDesigner | Средняя | Средний | Средняя |
| Отдельный процесс | Средняя плюс передача | Низкий | Высокая |
| Сервис по HTTP | Секунды | Как повезёт с сетью | Низкая |
Встроенные операторы просят только модели NVIDIA и считают всё на видеокарте, но работают только на Windows с RTX и умеют фиксированный набор задач — Встроенные операторы.
Python в процессе
PyTorch, Transformers или ONNX Runtime ставят во внешнее окружение, и tdPyEnvManager из палитры (с ветки 2025.30000) подключает виртуальное окружение или Conda к Python TouchDesigner, Внешние модули и окружения. Версия Python у пакетов та же, что внутри.
Python работает в главном потоке, и 30 мс инференса — это пропущенные кадры. Thread Manager (тоже с 2025.30000) держит пул рабочих потоков и очередь: загрузка и инференс уходят в фон. Из рабочего потока операторы, компоненты и параметры не трогают вовсе — данные передаются через задачу и колбэки, а колбэки выполняются в главном потоке, Отложенный запуск и потоки.
op('cam').numpyArray() отдаёт кадр массивом NumPy, всегда в плавающей
точке; с delayed=True результат приходит к следующему вызову и не
стопорит видеокарту. Обратно — copyNumpyArray() в Script TOP. Для CUDA
есть cudaMemory(): кадр в память CUDA мимо процессора.
Шаблон — пример TDDepthAnything от разработчика Derivative на сайте Derivative: Depth Anything V2 Small с Hugging Face через PyTorch и Transformers, окружение из tdPyEnvManager, загрузка и инференс через Thread Manager. Windows — PyTorch с CUDA на NVIDIA, macOS — процессор или Metal (MPS), а вариант v2 RT на TensorRT быстрее на свежих NVIDIA. Глубина и сегментация.
ONNX — общий формат: обучили в PyTorch, экспортировали и гоняют через ONNX Runtime без PyTorch, окружение легче, модель переносима.
import onnxruntime as ort
sess = ort.InferenceSession(
'models/depth.onnx',
providers=['CUDAExecutionProvider', 'CPUExecutionProvider'])
def infer(arr): # arr — массив NumPy под вход модели
return sess.run(None, {'input': arr})[0]
TensorRT собирает движок под конкретную карту: кратно быстрее, но движок привязан к карте и драйверу, и на другой машине его собирают заново.
Снаружи
Своим процессом — Python-сервис, ComfyUI, другой TouchDesigner — модель дороже по задержке, зато её падение шоу не роняет. Картинка передаётся через Spout, Syphon или NDI, управление по OSC или WebSocket; середина между мирами — Engine COMP. Сервис по HTTP (Веб) отвечает секундами: ассеты, текст, разовые операции, Речь, текст и языковые модели.
Кадр уменьшают до входа модели ещё в TouchDesigner — моделям нужны сотни пикселей, а не 4K. Прогревают при старте: первый проход медленный, сборка TensorRT занимает минуты. Считают 15–30 раз в секунду с интерполяцией. И заранее решают, что покажет шоу, если модель не ответила.
CUDA, cuDNN, TensorRT, PyTorch или ONNX Runtime, драйвер и Python должны быть совместимы. Рабочую комбинацию записывают и перед шоу не трогают.
Нашли в статье ошибку, устаревшее или непонятное место?