Risponderemo a tutte le tue domande!

Applicazioni e Guide

Rendering remoto di Blender con Flamenco

Quando il rendering di scene pesanti in Blender inizia a consumare troppo tempo del vostro team, avete due opzioni: aggiornare il computer di ogni membro del team o esternalizzare il rendering a una farm dedicata. Molte aziende offrono soluzioni di rendering già pronte, ma se avete bisogno di un controllo completo sull'infrastruttura, queste soluzioni potrebbero non essere l'opzione più affidabile.

Un approccio alternativo potrebbe essere la creazione di un'infrastruttura ibrida. In questa configurazione, l'archiviazione dei dati e la gestione della farm di rendering rimarrebbero all'interno dell'infrastruttura esistente. L'unico elemento che verrebbe collocato all'esterno sarebbero i server GPU a noleggio sui quali verrebbe eseguito il rendering.

In generale, l'infrastruttura della farm di rendering per Blender si presenta come segue:

Basic components scheme

Qui abbiamo un nodo centrale Manager che organizza tutti i processi. Riceve i compiti di rendering dagli utenti tramite uno specifico Blender Add-on e sposta tutti i file necessari su Shared Storage. Quindi, Manager distribuisce i compiti a Worker nodes. Questi ricevono un lavoro contenente tutte le informazioni su dove il Worker può trovare i file da renderizzare e cosa fare con i risultati ottenuti. Per implementare questo schema, è possibile utilizzare un'applicazione completamente gratuita e open-source chiamata Flamenco. In questa guida viene mostrato come preparare tutti i nodi, in particolare Manager e Worker.

Il nodo Storage non ha requisiti specifici. Può essere utilizzato con qualsiasi sistema operativo che supporti i protocolli SMB/CIFS o NFS. L'unico requisito è che la directory di archiviazione deve essere montata e accessibile dal sistema operativo. Nella vostra infrastruttura, questa può essere una qualsiasi cartella condivisa accessibile a tutti i nodi.

Ogni nodo ha indirizzi IP diversi e il server Wireguard VPN sarà un punto centrale che li unisce in un'unica rete L2. Questo server, situato sul perimetro esterno, consente di lavorare senza apportare modifiche alla politica NAT esistente.

Virtual components scheme

Per questo esempio, creiamo la seguente configurazione mista:

  • 10.0.0.1 - Wireguard VPN server (server virtuale di qualsiasi fornitore di infrastrutture) con un IP esterno;
  • 10.0.0.2 - Worker node (server dedicato di LeaderGPU) con un IP esterno;
  • 10.0.0.3 - Manager node (server virtuale nella rete dell'ufficio) situato dietro NAT;
  • 10.0.0.4 - Storage node (server virtuale nella rete dell'ufficio) situato dietro NAT;
  • 10.0.0.5 - User node (laptop consumer nella rete dell'ufficio) situato dietro NAT.

Passo 1. Wireguard

Server VPN

È possibile installare e configurare Wireguard manualmente, utilizzando una guida ufficiale e degli esempi. Tuttavia, esiste un'alternativa più semplice: uno script non ufficiale realizzato da un ingegnere informatico di Parigi (Stanislas aka angristan).

Scaricate lo script da GitHub:

wget https://raw.githubusercontent.com/angristan/wireguard-install/master/wireguard-install.sh

Rendetelo eseguibile:

sudo chmod +x wireguard-install.sh

Eseguire:

sudo ./wireguard-install.sh

Seguire le istruzioni e impostare l'intervallo di indirizzi IP 10.0.0.1/24. Il sistema chiederà di creare immediatamente un file di configurazione per il primo client. Secondo il piano, questo client sarà il nodo worker con nome Worker e indirizzo 10.0.0.2. Al termine dello script, nella directory principale apparirà un file di configurazione: /root/wg0-client-Worker.conf.

Eseguire il seguente comando per visualizzare la configurazione:

cat /home/usergpu/wg0-client-Worker.conf
[Interface]
PrivateKey = [CLIENT_PRIVATE_KEY]
Address = 10.0.0.2/32,fd42:42:42::2/128
DNS = 1.1.1.1,1.0.0.1
[Peer]
PublicKey = [SERVER_PRIVATE_KEY]
PresharedKey = [SERVER_PRESHARED_KEY]
Endpoint = [IP_ADDRESS:PORT]
AllowedIPs = 10.0.0.0/24,::/0

Eseguire nuovamente lo script di installazione per creare un altro client. Aggiungere tutti i client futuri in questo modo e infine verificare che tutti i file di configurazione siano stati creati:

cd ~/
ls -l | grep wg0
-rw-r--r-- 1 root    root      529 Jul 14 12:59 wg0-client-Manager.conf
-rw-r--r-- 1 root    root      529 Jul 14 12:59 wg0-client-Storage.conf
-rw-r--r-- 1 root    root      529 Jul 14 12:59 wg0-client-User.conf
-rw-r--r-- 1 root    root      529 Jul 14 12:58 wg0-client-Worker.conf

Clienti VPN

I client VPN comprendono tutti i nodi che devono essere collegati a una singola rete. Nella nostra guida, si tratta del nodo manager, del nodo di archiviazione, del nodo client (se si utilizza Linux) e dei nodi worker. Se il server VPN è in esecuzione su un nodo worker, non è necessario configurarlo come client (questo passaggio può essere saltato).

Aggiornare il repository della cache dei pacchetti, quindi installare i pacchetti Wireguard e CIFS:

sudo apt update && sudo apt -y install wireguard cifs-utils

Elevare i privilegi a superuser:

sudo -i

Aprire la directory di configurazione di Wireguard:

cd /etc/wireguard

Eseguire il comando umask in modo che solo il superutente abbia accesso ai file di questa directory:

umask 077

Generare una chiave privata e salvarla in un file:

wg genkey > private-key

Generare una chiave pubblica utilizzando la chiave privata:

wg pubkey > public-key < private-key

Creare un file di configurazione:

nano /etc/wireguard/wg0.conf

Incollare la propria configurazione, creata per questo client:

[Interface]
PrivateKey = [CLIENT_PRIVATE_KEY]
Address = 10.0.0.2/32,fd42:42:42::2/128
DNS = 1.1.1.1,1.0.0.1
[Peer]
PublicKey = [SERVER_PRIVATE_KEY]
PresharedKey = [SERVER_PRESHARED_KEY]
Endpoint = [SERVER_IP_ADDRESS:PORT]
AllowedIPs = 10.0.0.0/24,::/0
PersistentKeepalive = 1

Non dimenticare di aggiungere l'opzione PersistentKeepalive = 1 (dove 1 significa 1 secondo) su ogni nodo situato dietro NAT. È possibile scegliere questo periodo in via sperimentale. Il valore consigliato dagli autori di Wireguard è 25. Salvare il file e uscire, usando la scorciatoia CTRL + X e il tasto Y per confermare.

Se si desidera passare il traffico Internet, impostare AllowedIPs su 0.0.0.0/0,::/0

Quindi, effettuare il logout dall'account root:

exit

Avviare la connessione utilizzando systemctl:

sudo systemctl start wg-quick@wg0.service

Verificare che tutto sia a posto e che il servizio sia stato avviato correttamente:

sudo systemctl status wg-quick@wg0.service
● wg-quick@wg0.service - WireGuard via wg-quick(8) for wg0
Loaded: loaded (/lib/systemd/system/wg-quick@.service; enabled; vendor preset: enabled)
Active: active (exited) since Mon 2023-10-23 09:47:53 UTC; 1h 45min ago
  Docs: man:wg-quick(8)
        man:wg(8)
        https://www.wireguard.com/
        https://www.wireguard.com/quickstart/
        https://git.zx2c4.com/wireguard-tools/about/src/man/wg-quick.8
        https://git.zx2c4.com/wireguard-tools/about/src/man/wg.8
Process: 4128 ExecStart=/usr/bin/wg-quick up wg0 (code=exited, status=0/SUCCESS)
Main PID: 4128 (code=exited, status=0/SUCCESS)
  CPU: 76ms

Se si verifica un errore del tipo "resolvconf: comando non trovato" in Ubuntu 22.04, è sufficiente creare un collegamento di simbolo:

sudo ln -s /usr/bin/resolvectl /usr/local/bin/resolvconf

Abilitate il nuovo servizio a connettersi automaticamente durante l'avvio del sistema operativo:

sudo systemctl enable wg-quick@wg0.service

Ora è possibile verificare la connettività inviando pacchetti echo:

ping 10.0.0.1
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=145 ms
64 bytes from 10.0.0.1: icmp_seq=2 ttl=64 time=72.0 ms
64 bytes from 10.0.0.1: icmp_seq=3 ttl=64 time=72.0 ms
64 bytes from 10.0.0.1: icmp_seq=4 ttl=64 time=72.2 ms
--- 10.0.0.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 71.981/90.230/144.750/31.476 ms

Passo 2. Nodo NAS

Connettersi al server VPN utilizzando la guida del punto 1. Quindi, installare i pacchetti Samba del server e del client:

sudo apt install samba samba-client

Eseguire il backup della configurazione predefinita:

sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak

Creare una directory che verrà utilizzata come condivisione:

sudo mkdir /mnt/share

Creare un nuovo gruppo di utenti che avrà accesso alla nuova condivisione:

sudo groupadd smbusers

Aggiungere un utente esistente al gruppo creato:

sudo usermod -aG smbusers user

Impostare una password per questo utente. Questo è un passo necessario perché la password di sistema e la password di Samba sono entità diverse:

sudo smbpasswd -a $USER

Rimuovere la configurazione predefinita:

sudo rm /etc/samba/smb.conf

e crearne una nuova:

sudo nano /etc/samba/smb.conf
[global]
workgroup = WORKGROUP
security = user
map to guest = bad user
wins support = no
dns proxy = no
[private]
path = /mnt/share
valid users = @smbusers
guest ok = no
browsable = yes
writable = yes

Salvare il file e testare i nuovi parametri:

testparm -s

Riavviare entrambi i servizi Samba:

sudo service smbd restart
sudo service nmbd restart

Infine, dare il permesso di condividere la cartella:

sudo chown user:smbusers /mnt/share

Passo 3. Connessione del client Samba

Tutti i nodi di Flamenco utilizzano una directory condivisa situata in /mnt/flamenco. È necessario montare questa directory su ogni nodo prima di eseguire gli script flamenco-client o flamenco-manager. In questo esempio, utilizziamo un nodo worker ospitato su LeaderGPU con il nome utente usergpu. Si prega di sostituire questi dati con i propri se differiscono.

Creare un file nascosto in cui memorizzare le credenziali della condivisione SMB:

nano /home/usergpu/.smbcredentials

Digitare queste due stringhe:

username=user # your Samba username
password=password # your Samba password

Salvare il file e uscire. Quindi, proteggete il file modificando i permessi di accesso:

sudo chmod 600 /home/usergpu/.smbcredentials

Creare una nuova directory che possa essere usata come punto di montaggio per collegare lo storage remoto:

sudo mkdir /mnt/flamenco

E rendere l'utente proprietario di questa directory:

sudo chown usergpu:users /mnt/flamenco

L'unica cosa che rimane è che la directory di rete venga montata automaticamente:

sudo nano /etc/systemd/system/mnt-flamenco.mount
[Unit]
Description=Mount Remote Storage
[Mount]
What=//10.0.0.4/private
Where=/mnt/flamenco
Type=cifs
Options=mfsymlinks,credentials=/home/usergpu/.smbcredentials,uid=usergpu,gid=users
[Install]
WantedBy=multi-user.target

Aggiungete due righe alla vostra configurazione VPN nella sezione [Interface]:

sudo -i
nano /etc/wireguard/wg0.conf
…
PostUp = ping 10.0.0.4 -c 4 && systemctl start mnt-flamenco.mount
PostDown = systemctl stop mnt-flamenco.mount
…

Riavviare il server:

sudo shutdown -r now

Verificare che i servizi siano caricati e che la directory condivisa sia montata correttamente:

df -h
Filesystem          Size  Used Avail Use% Mounted on
tmpfs                35G  3.3M   35G   1% /run
/dev/sda2            99G   18G   77G  19% /
tmpfs               174G     0  174G   0% /dev/shm
tmpfs               5.0M     0  5.0M   0% /run/lock
tmpfs                35G  8.0K   35G   1% /run/user/1000
//10.0.0.4/private   40G  9.0G   31G  23% /mnt/flamenco

Passo 4. Nodo manager

Impostare una connessione VPN seguendo la guida del passaggio 1. Arrestare il servizio VPN prima di continuare:

sudo systemctl stop wg-quick@wg0.service

Prepariamoci. Il montaggio automatico richiede utility per il protocollo CIFS:

sudo apt -y install cifs-utils

Il prossimo passo importante è l'installazione di Blender. È possibile farlo utilizzando il gestore di pacchetti APT standard, ma molto probabilmente verrà installata una delle versioni più vecchie (meno della v3.6.4). Utilizziamo Snap per installare l'ultima versione:

sudo snap install blender --classic

Controllare la versione installata usando il seguente comando:

blender --version
Blender 4.4.3
build date: 2025-04-29
build time: 15:12:13
build commit date: 2025-04-29
build commit time: 14:09
build hash: 802179c51ccc
build branch: blender-v4.4-release
build platform: Linux
build type: Release
…

Se si riceve un messaggio di errore che indica la mancanza di librerie, è sufficiente installarle. Tutte queste librerie sono incluse nel pacchetto XOrg:

sudo apt -y install xorg

Scaricare l'applicazione:

wget https://flamenco.blender.org/downloads/flamenco-3.7-linux-amd64.tar.gz

Decomprimere l'archivio scaricato:

tar xvfz flamenco-3.7-linux-amd64.tar.gz

Andare alla directory creata:

cd flamenco-3.7-linux-amd64/

E avviare Flamenco per la prima volta:

./flamenco-manager

Aprite il seguente indirizzo nel vostro browser web: http://10.0.0.3:8080/. Fate clic sul pulsante Let's go. Digitare /mnt/flamenco nel campo richiesto, quindi fare clic su Next:

Shared storage setup

Flamenco cercherà di individuare il file eseguibile di Blender. Se avete installato Blender da Snap, il percorso sarà /snap/bin/blender. Controllate questo punto e fate clic su Next:

PATH environment setup

Controllate il riepilogo e fate clic su Confirm:

Check summary settings

Tornare alla sessione SSH e usare la scorciatoia da tastiera Ctrl + C per interrompere l'applicazione. Il primo avvio genera il file di configurazione flamenco-manager.yaml. Aggiungiamo alcune opzioni alle sezioni variables e blenderArgs:

nano flamenco-manager.yaml
# Configuration file for Flamenco.
# For an explanation of the fields, refer to flamenco-manager-example.yaml
#
# NOTE: this file will be overwritten by Flamenco Manager's web-based configuration system.
#
# This file was written on 2023-10-17 12:41:28 +00:00 by Flamenco 3.7
_meta:
  version: 3
manager_name: Flamenco Manager
database: flamenco-manager.sqlite
listen: :8080
autodiscoverable: true
local_manager_storage_path: ./flamenco-manager-storage
shared_storage_path: /mnt/flamenco
shaman:
  enabled: true
  garbageCollect:
    period: 24h0m0s
    maxAge: 744h0m0s
    extraCheckoutPaths: []
task_timeout: 10m0s
worker_timeout: 1m0s
blocklist_threshold: 3
task_fail_after_softfail_count: 3
variables:
  blender:
    values:
    - platform: linux
      value: blender
    - platform: windows
      value: blender
    - platform: darwin
      value: blender
  storage:
    values:
    is_twoway: true
    values:
    - platform: linux
      value: /mnt/flamenco
    - platform: windows
      value: Z:\
    - platform: darwin
      value: /Volumes/shared/flamenco
  blenderArgs:
    values:
    - platform: all
      value: -b -y -E CYCLES -P gpurender.py

Il primo blocco aggiuntivo descrive ulteriori variabili bidirezionali, necessarie per le farm multipiattaforma. Questo risolve il problema principale degli slash e dei percorsi. In Linux si usa il simbolo della barra in avanti (/) come separatore, mentre in Windows si usa il simbolo del backslash (\). In questo caso, creiamo la regola di sostituzione per tutte le alternative disponibili: Linux, Windows e macOS (Darwin).

Quando si monta una condivisione di rete in Windows, è necessario scegliere una lettera di unità. Ad esempio, il nostro Storage è montato con la lettera Z:. La regola di sostituzione indica al sistema che, per la piattaforma Windows, il percorso /mnt/flamenco sarà situato in Z:\. Per macOS, questo percorso sarà /Volumes/shared/flamenco.

Osservate il secondo blocco aggiunto. Questo indica a Blender di usare il motore di rendering Cycles e chiama un semplice script Python, gpurender.py, quando Blender viene eseguito. Si tratta di un semplice trucco per selezionare la GPU invece della CPU. Non esiste un'opzione standard per farlo direttamente. Non è possibile invocare blender --use-gpu o qualcosa di simile. Tuttavia, è possibile invocare qualsiasi script Python esterno usando l'opzione -P. Questo comando indica a Worker di trovare uno script nella directory locale e di eseguirlo quando il lavoro assegnato richiama l'eseguibile di Blender.

Ora possiamo delegare il controllo dell'applicazione al sottosistema systemd init. Informiamo il sistema sulla posizione della directory di lavoro, sul file eseguibile e sui privilegi dell'utente necessari per il lancio. Creare un nuovo file:

sudo nano /etc/systemd/system/flamenco-manager.service

Compilatelo con le seguenti stringhe:

[Unit]
Description=Flamenco Manager service
[Service]
User=user
WorkingDirectory=/home/user/flamenco-3.7-linux-amd64
ExecStart=/home/user/flamenco-3.7-linux-amd64/flamenco-manager
Restart=always
[Install]
WantedBy=multi-user.target

Salvare il file e uscire dall'editor di testo nano.

sudo systemctl daemon-reload
sudo systemctl start flamenco-manager.service
sudo systemctl status flamenco-manager.service
● flamenco-manager.service - Flamenco Manager service
Loaded: loaded (/etc/systemd/system/flamenco-manager.service; disabled; vendor preset: enabled)
Active: active (running) since Tue 2023-10-17 11:03:50 UTC; 7s ago
Main PID: 3059 (flamenco-manage)
 Tasks: 7 (limit: 4558)
  Memory: 28.6M
     CPU: 240ms
CGroup: /system.slice/flamenco-manager.service
        └─3059 /home/user/flamenco-3.7-linux-amd64/flamenco-manager

Abilitare l'avvio automatico all'avvio del sistema:

sudo systemctl enable flamenco-manager.service

Passo 5. Nodo lavoratore

Connettersi al server VPN utilizzando la guida del passaggio 1 e montare la condivisione del passaggio 3. Arrestare il servizio VPN prima di continuare:

sudo snap install blender --classic

I moderni file *.blend sono compressi con l'algoritmo Zstandard. Per evitare errori, è essenziale incorporare il supporto per questo algoritmo:

sudo apt -y install python3-zstd

Scaricare l'applicazione:

wget https://flamenco.blender.org/downloads/flamenco-3.7-linux-amd64.tar.gz

Decomprimere l'archivio scaricato:

tar xvfz flamenco-3.7-linux-amd64.tar.gz

Navigare nella directory creata:

cd flamenco-3.7-linux-amd64/

Creare uno script aggiuntivo che abiliti il rendering GPU durante l'esecuzione di Flamenco jobs:

nano gpurender.py
import bpy
def enable_gpus(device_type, use_cpus=False):
    preferences = bpy.context.preferences
    cycles_preferences = preferences.addons["cycles"].preferences
    cycles_preferences.refresh_devices()
    devices = cycles_preferences.devices
    if not devices:
        raise RuntimeError("Unsupported device type")
    activated_gpus = []
    for device in devices:
        if device.type == "CPU":
            device.use = use_cpus
        else:
            device.use = True
            activated_gpus.append(device.name)
            print('activated gpu', device.name)
    cycles_preferences.compute_device_type = device_type
    bpy.context.scene.cycles.device = "GPU"
    return activated_gpus
enable_gpus("CUDA")

Salvare il file e uscire. Quindi, creare un servizio separato per eseguire Flamenco da systemd:

sudo nano /etc/systemd/system/flamenco-worker.service
[Unit]
Description=Flamenco Worker service
[Service]
User=usergpu
WorkingDirectory=/home/usergpu/flamenco-3.7-linux-amd64
ExecStart=/home/usergpu/flamenco-3.7-linux-amd64/flamenco-worker
Restart=always
[Install]
WantedBy=multi-user.target

Ricaricare la configurazione e avviare il nuovo servizio:

sudo systemctl daemon-reload
sudo systemctl start flamenco-worker.service
sudo systemctl status flamenco-worker.service
● flamenco-worker.service - Flamenco Worker service
Loaded: loaded (/etc/systemd/system/flamenco-worker.service; enabled; preset: enabled)
Active: active (running) since Tue 2023-10-17 13:56:18 EEST; 47s ago
Main PID: 636 (flamenco-worker)
 Tasks: 5 (limit: 23678)
Memory: 173.9M
   CPU: 302ms
CGroup: /system.slice/flamenco-worker.service
        └─636 /home/user/flamenco-3.7-linux-amd64/flamenco-worker

Attivare l'avvio automatico all'avvio del sistema:

sudo systemctl enable flamenco-worker.service

Passo 6. Nodo utente

Il nodo utente può essere gestito con qualsiasi sistema operativo. In questa guida mostriamo come configurare un nodo con Windows 11 e i 4 componenti necessari:

  1. connessione VPN
  2. Directory remota montata
  3. Blender installato
  4. Componente aggiuntivo Flamenco

Scaricare e installare Wireguard dal sito ufficiale. Creare un nuovo file di testo e incollarvi la configurazione generata per il client al punto 1. Rinominate il file in flamenco.conf e aggiungetelo a Wireguard utilizzando il pulsante Add tunnel:

Wireguard Add Tunnel

Collegarsi al server premendo il pulsante Activate:

Activate the tunnel

Montiamo una directory remota. Fare clic con il tasto destro del mouse su This PC e selezionare Map network drive…

Mount the remote directory

Scegliere Z: come lettera di unità, digitare l'indirizzo della condivisione Samba \\10.0.0.4\private e non dimenticare di spuntare Connect using different credentials. Quindi fare clic su Finish. Il sistema chiederà di inserire un nome utente e una password per la condivisione. Successivamente, la directory di rete verrà montata come unità Z:.

Scaricare e installare Blender dal sito ufficiale. Quindi, aprire l'URL http://10.0.0.3:8080/flamenco3-addon.zip e installare il componente aggiuntivo Flamenco. Attivarlo nelle preferenze: Edit > Preferences > Add-ons. Spuntare System: Flamenco 3, inserire l'URL del manager http://10.0.0.3:8080 e fare clic sul pulsante di aggiornamento. Il sistema si collegherà al nodo manager e caricherà automaticamente le impostazioni di archiviazione:

Enable Flamenco add-on

Aprire il file da renderizzare. Nella scheda Scene, scegliere Cycles dall'elenco a discesa Render Engine. Non dimenticate di salvare il file, perché queste impostazioni sono memorizzate direttamente nel file *.blend:

Select Render Engine

Scorrere verso il basso e trovare la sezione Flamenco 3. Fare clic su Fetch job types per ottenere un elenco dei tipi disponibili. Selezionare Simple Blender Render dall'elenco a discesa e impostare altre opzioni, come il numero di fotogrammi, la dimensione dei pezzi e la cartella di output. Infine, fare clic su Submit to Flamenco:

Set rendering parameters

Il componente aggiuntivo Flamenco crea un nuovo lavoro e carica un file blend sull'archivio condiviso. Il sistema invia il lavoro a un worker disponibile e avvia il processo di rendering:

Check added rendering job

Se si controlla il carico della GPU con nvtop o utility simili, si vede che tutte le GPU hanno compiti di calcolo:

Check GPU load

Il risultato si trova in una directory selezionata nel passaggio precedente. Esempio qui (Ripple Dreams di James Redmond)

Vedere anche:



Aggiornato: 12.08.2025

Pubblicato: 21.01.2025