
Python ile Render Farm Otomasyonu: Bugün Neler Script'lenebilir
Genel bakış
Bir bulut render işinin en yavaş kısmı çoğu zaman render'ın kendisi değil, çevresindeki her şeydir: bir dokusu hâlâ yerel bir sürücüyü gösterdiği için başarısız olan sahne, baştan başlaması gereken yükleme, kareler geri geldi mi diye kimse bakmadığı için fark edilmeyen eksik kareler. Asıl soru, bir Python script'inin gerçekte nereye ulaşabildiğidir.
Super Renders Farm olarak tam yönetimli bir farm işletiyoruz ve bu sınır konusunda net olmak istiyoruz; çünkü var olmayan bir yol üzerine kurulan otomasyon, gözetimsiz ilk gecesinde çöker. Bu yüzden düz cevabı baştan veriyoruz. Proje dosyalarını farm'a taşımak script ile yapılabilir: S3 erişimi (hesabınızdaki Cloud Direct Connect), AWS CLI'nin SRF Space'inize dosya kopyalamak ve oradan dosya almak için kullandığı bir erişim anahtarı verir. İş gönderimi ise script ile yapılamaz: işler web panosundan, Client App'ten ya da 3ds Max, Maya veya Cinema 4D içindeki gönderme eklentisinden gönderilir. SFTP veya FTP hizmeti, herkese açık bir API ya da SDK, koddan çağırabileceğiniz bir iş gönderme uç noktası sunmuyoruz. Programatik gönderim için herkese açık bir API yol haritamızda; şu an mevcut değil ve aşağıdakilerin hiçbiri ona bağlı değil.
Bu sayfayı daha önce görenler için bir not: önceki sürüm, SFTP üzerinden script ile yapılan transferleri anlatıyordu. Bu yol farm'ımızda sunulmuyor; script ile transferler artık aşağıda ele alınan S3 erişimi üzerinden yapılıyor.
Python için yine de yapacak çok şey kalıyor. Yüklemeden önceki her şey, yüklemenin kendisi ve kareler diskinize düştükten sonraki her şey script ile yapılabilir. Headless ve gözetimsiz render'ın kavramsal haritası için headless render farm gözetimsiz iş akışı rehberimize bakın; bu yazı kod düzeyinde kalıyor.
Yönetimli Bir Farm'da Sınır Nerede Duruyor
Farm'ımızda iş hattı dört kısma ayrılır.
- Yüklemeden önce: sizin, tamamen script ile yapılabilir. DCC içinde sahne doğrulama, yol düzeltmeleri, paketleme, ön kontroller, sağlama toplamları.
- Yükleme: S3 erişimi ile script'lenebilir ya da elle. AWS CLI, proje klasörünü bir script'ten SRF Space'inize kopyalar. Elle seçenekler web yüklemesi ve SuperRenders Client App'tir. Web yüklemesinin sabit bir boyut sınırı yoktur, ancak sekme kapanırsa devam etmez; bu yüzden birkaç gigabayttan büyük her şey için ya da kararsız bir bağlantıda Client App'i (devam ettirilebilir, paralel parçalar) veya S3 erişimini kullanın. Tek bir tarayıcı yüklemesi ev tipi bağlantılarda yaklaşık 2 GB'ın üzerinde yavaşlar, yaklaşık 5 GB'ın üzerinde güvenilmez hale gelir.
- Gönderim: elle. Web panosundan, Client App'ten veya gönderme eklentisinden gönderirsiniz; farm, iş ücretlendirilmeden önce yüklenen projede Scene Analysis çalıştırır.
- Render'dan sonra: yine sizin. Client App'in otomatik indirmesi açıkken kareler, her biri bittikçe yerel bir klasöre akar; ya da bir script bunları S3 üzerinden çeker. Bir kare diskinize ulaştığı andan itibaren her kontrol, kodlama, kopyalama ve bildirim yerel bir script'tir.
Dolayısıyla gerçekçi tablo, kısa bir elle adımın iki yanında otomasyondur; aşağıdaki script'ler bu adımı hızlı ve yanlış yapılması zor hale getirir. Tam yönetimli bir render farm'ın ne olduğunu anlatan açıklamamız, yönetimli modelin sizin yerinize neleri üstlendiğini kapsar.
Üç şerit: scriptlenebilir sahne kontrolleri ve S3 yüklemesi, elle iş gönderimi, ardından scriptlenebilir kare kontrolleri ve encoding
Otomasyon, kısa bir elle adımın iki yanında yer alır: sizin tarafınızda doğrulama, ön kontrol, manifest ve yükleme; gönderimi elle yapın, ardından geri gelenleri doğrulayın ve post-process uygulayın.
Adım 1: Sahneyi DCC İçinde Doğrulayın
Deneyimlerimize göre başarısız render işlerinin çoğu renderer hatası değildir. Bunlar paketleme boşluklarıdır: farm'ın hiç görmediği bir sürücüdeki doku, toplanmamış bir referans dosya, proje kökünün bir üst klasöründeki cache. Bir worker yalnızca yüklenen klasörün içindekini açabilir; bu yüzden ilk script, sahnenin kendi bağımlılık listesini okuyabildiği DCC'nin içine aittir.
Her büyük DCC bunu Python üzerinden sunar: Maya'da maya.cmds, 3ds Max'te pymxs, Cinema 4D'de c4d modülü, Houdini'de hou, Blender'da bpy. Önce DCC'nin kendi toplama adımını çalıştırın (3ds Max'te Resource Collector ya da Archive ve ardından yazdığı arşivi açmak; Cinema 4D'de Save Project with Assets; Blender'da varlıkları .blend dosyasının klasörünün altında tutup Make Paths Relative çalıştırmak). Toplama adımı dosyaları bir araya getirir; script sonucu kanıtlar. Blender sürümü Scripting çalışma alanında ya da blender -b scene.blend --python check_paths.py ile headless olarak çalışır:
# check_paths.py: runs inside Blender, reads the open .blend, touches nothing remote
import os
import sys
import bpy
def inside(path, root):
try:
a, b = os.path.normcase(path), os.path.normcase(root)
return os.path.commonpath([a, b]) == b
except ValueError:
return False # different drive on Windows
def main():
if not bpy.data.filepath:
if bpy.app.background:
sys.exit("save the .blend first")
print("save the .blend first")
return
bpy.ops.file.make_paths_relative() # rewrite paths under the .blend's folder to // form
blend_dir = os.path.dirname(bpy.data.filepath)
refs = [("image", i) for i in bpy.data.images
if i.source == "FILE" and not i.packed_file] # skip generated, sequence, UDIM, packed
refs += [("library", lib) for lib in bpy.data.libraries]
refs += [("cache", c) for c in bpy.data.cache_files] # Alembic and USD caches
refs += [("volume", v) for v in bpy.data.volumes] # OpenVDB volumes
issues = []
for kind, block in refs:
full = os.path.abspath(bpy.path.abspath(block.filepath))
if not os.path.exists(full):
issues.append((f"missing {kind}", block.name, block.filepath))
elif not inside(full, blend_dir):
issues.append(("outside project", block.name, block.filepath))
for kind, name, path in issues:
print(f"{kind:16} {name:32} {path}")
if not issues:
bpy.ops.wm.save_mainfile() # keep the relative paths only when the scene is clean
if bpy.app.background:
sys.exit(1 if issues else 0)
main()
Kalıp her DCC'ye taşınır: her dosya referansını çözün, eksik olanları işaretleyin ve proje kökünün dışına çözümlenenleri de işaretleyin.
Bazı projeler göreli yollara geçemez; çünkü scatter kütüphaneleri, insan kütüphaneleri ve bazı cache'ler mutlak yolları kendi içlerinde tutar. Bunlar için Client App'in Auto keep local path seçeneği yüklemede mutlak klasör yapısını korur; farm tarafındaki yolun yerel yolunuzdan farklı olması gerektiğinde ise Simulate Local Path aracımız sahnenin beklediği yolu yeniden oluşturur. Bu durumda script'iniz "her şey proje kökünün altında" yerine "korumayı seçtiğiniz köklerin altındaki her şey" koşulunu denetler. 3ds Max için bir 3ds Max dosyasının nasıl paketleneceğini anlatan rehberimiz toplama adımını adım adım gösterir.
Adım 2: Proje Klasörüne Ön Kontrol Uygulayın
DCC kontrolü sahneyi bilir; klasör kontrolü yüklemeyi bilir. Diskte yaşayan sorunları yakalar: sahne dosyasının olmaması, birinin klasöre bıraktığı bir arşiv, yarım kalmış bir kopyadan kalan sıfır baytlık dosyalar, eski Windows uygulamalarını tökezletecek kadar uzun yollar.
Arşiv kontrolü göründüğünden daha önemlidir. Farm arşivleri açmaz (.zip, .rar, .7z, .tar, .tar.gz), bu yüzden bir arşivin içindeki hiçbir şey render edilmez. Proje klasörünüzü sıkıştırılmamış olarak, sahne dosyası ve başvurulan her varlık yerinde olacak şekilde yükleyin.
#!/usr/bin/env python3
"""preflight.py: check a project folder before upload. Reads local disk only."""
import json
import sys
from pathlib import Path
SCENE_SUFFIXES = {".max", ".ma", ".mb", ".c4d", ".blend", ".hip", ".hiplc", ".aep"}
ARCHIVE_SUFFIXES = {".zip", ".rar", ".7z", ".tar", ".tgz"} # the farm does not extract these
SINGLE_BROWSER_UPLOAD_GB = 2 # above this, use the Client App or S3 access instead
LONG_PATH = 240 # headroom under the classic 260-character Windows limit
def preflight(root: Path) -> dict:
files = [p for p in root.rglob("*") if p.is_file()]
scenes = [p for p in files if p.suffix.lower() in SCENE_SUFFIXES]
total = sum(p.stat().st_size for p in files)
problems, warnings = [], []
if not scenes:
problems.append("no scene file found in the folder")
for p in files:
rel = p.relative_to(root)
if p.suffix.lower() in ARCHIVE_SUFFIXES or p.name.lower().endswith(".tar.gz"):
problems.append(f"archive will not be unpacked: {rel}")
if p.stat().st_size == 0:
warnings.append(f"zero-byte file: {rel}")
if len(str(p)) > LONG_PATH:
warnings.append(f"long path ({len(str(p))} chars): {rel}")
if total > SINGLE_BROWSER_UPLOAD_GB * 1024**3:
warnings.append("over ~2 GB: use the Client App or S3 access, not one browser upload")
return {"root": str(root), "files": len(files), "gigabytes": round(total / 1024**3, 2),
"scenes": [str(p.relative_to(root)) for p in scenes],
"problems": problems, "warnings": warnings}
if __name__ == "__main__":
report = preflight(Path(sys.argv[1]).resolve())
print(json.dumps(report, indent=2))
sys.exit(1 if report["problems"] else 0)
Sıfır olmayan çıkış kodu işin özüdür. Script'i, bir sanatçının günün sonunda zaten çalışan her şeye (bir yayınlama aracı, bir kaydetme kancası, bir "farm için hazır" düğmesi) bağlayın; böylece sorunlu bir proje yüklemeye hiç ulaşmaz. Uyarılar yazdırılır; sorunlar engeller.
Adım 3: Tam Olarak Ne Gönderdiğinizi Bilmek İçin Manifest Yazın
Bir proje ön kontrolü geçtikten sonra kaydedin. Manifest, her dosyayı boyutu ve SHA-256 hash'i ile listeler; projenin içine değil yanına yazılır, böylece yüklemenin parçası olmaz. Aksi halde bir öğleden sonraya mal olacak üç soruyu yanıtlar: sahnenin hangi sürümü render edildi, son gönderimden bu yana ne değişti ve diskteki klasör gönderilenle hâlâ eşleşiyor mu.
# manifest.py: hash a project folder and compare two snapshots. Local files only.
import hashlib
import json
import time
from pathlib import Path
def sha256(path: Path, chunk: int = 8 * 1024 * 1024) -> str:
h = hashlib.sha256()
with open(path, "rb") as f:
while block := f.read(chunk):
h.update(block)
return h.hexdigest()
def write_manifest(root: Path, out: Path) -> dict:
files = [{"path": p.relative_to(root).as_posix(), "bytes": p.stat().st_size, "sha256": sha256(p)}
for p in sorted(root.rglob("*")) if p.is_file()]
manifest = {"project": root.name, "created": time.strftime("%Y-%m-%dT%H:%M:%S"), "files": files}
out.write_text(json.dumps(manifest, indent=2))
return manifest
def diff_manifests(old: dict, new: dict):
a = {f["path"]: f["sha256"] for f in old["files"]}
b = {f["path"]: f["sha256"] for f in new["files"]}
changed = sorted(k for k in a.keys() & b.keys() if a[k] != b[k])
return sorted(b.keys() - a.keys()), sorted(a.keys() - b.keys()), changed
Manifestleri çekim ve sürüme göre saklayın (shot010_v003.manifest.json); fark tek satırlık bir özete dönüşür: "iki doku değişti, bir cache eklendi, hiçbir şey kaldırılmadı".
AWS CLI ile Transferleri Script'lemek
S3 erişimi (hesabınızdaki Cloud Direct Connect), bir erişim anahtarı oluşturmanızı ve ardından dosya yüklemek ve indirmek için Cyberduck'ı (protokol: Amazon S3) veya AWS CLI'yi SRF Space'inize bağlamanızı sağlar. Cyberduck, dosya tarayıcısı isteyenlere uygundur; bir script'in sürebileceği araç AWS CLI'dir. S3 erişimi yalnızca dosya taşır: bir SFTP veya FTP hizmeti değildir ve iş göndermez.
Kurulum makine başına bir kez yapılır. Hesabınızda Cloud Direct Connect'i açın, bir erişim anahtarı oluşturun ve Access Key ID, Secret Access Key ve Remote Directory değerlerini kopyalayın. Ardından anahtarı adlandırılmış bir AWS profilinde saklayın:
aws configure --profile srf # both keys; region ap-southeast-1; output format blank or json
export AWS_PROFILE=srf # the AWS CLI and boto3 both read this
Proje klasörünü, ön kontrolü geçen aynı klasörü, sıkıştırılmamış olarak Remote Directory'nize yükleyin:
aws s3 cp ./shot010_v003 "s3://<your Remote Directory>/shot010_v003/" --recursive
aws s3 sync, --recursive olmadan aynı kaynağı ve hedefi alır ve yalnızca boyut ya da zaman damgasına göre yeni veya değişmiş dosyaları kopyalar; bu yüzden yarıda kalan bir transferden sonra yeniden çalıştırmak, zaten ulaşmış olanları atlar. Büyük dosyalar otomatik olarak paralel çok parçalı yüklemelere bölünür. Bu şekilde yüklenen dosyalar SRF Space'inizde görünür ve diğer yüklemeler gibi gönderilebilir. Ön kontrol için bir uyarı: bir proje render düğümlerine senkronize edilirken *.ini, *.db, *.tmp, *.temp, *.lnk, *.swap ve *.partial ile eşleşen dosyalar ve tüm rendertemp/ klasörleri atlanır; bu yüzden sahne bunlara bağımlı olmamalıdır.
Python tarafı ince bir sarmalayıcıdır: ön kontrolü çalıştırın, sorun varsa yüklemeyi reddedin, ardından klasörü AWS CLI'ye devredin.
# upload_project.py: pre-flight, then copy the folder to your SRF Space with the AWS CLI.
import os
import subprocess
import sys
from pathlib import Path
from preflight import preflight # the Step 2 script
def upload(project: Path, remote_dir: str) -> None:
report = preflight(project)
if report["problems"]:
sys.exit("pre-flight failed: " + "; ".join(report["problems"]))
target = f"s3://{remote_dir.removeprefix('s3://').strip('/')}/{project.name}/"
subprocess.run(["aws", "s3", "sync", str(project), target,
"--region", "ap-southeast-1"], check=True)
if __name__ == "__main__":
upload(Path(sys.argv[1]).resolve(), os.environ["SRF_REMOTE_DIR"])
Python içinde kalmayı tercih ederseniz, boto3'ün upload_file işlevi, aynı profil ve bölge ile Remote Directory'nizdeki bucket ve önek üzerinde aynı işi yapar.
Aynı anahtar diğer yönde de çalışır. Render çıktısı Space'inizin SuperRendersOutput/<jobId>/ klasörüne düşer (aws s3 ls "s3://<your Remote Directory>/SuperRendersOutput/" iş klasörlerini listeler) ve tek bir komut bir işi yerel bir klasöre çeker:
aws s3 sync "s3://<your Remote Directory>/SuperRendersOutput/<jobId>/" ./renders/shot010_v003/
Anahtara bir parola gibi davranın:
- Anahtarı elinde tutan herkes SRF Space'inize erişebilir. Anahtarı script'in içinde değil, yüklemeyi çalıştıran makinedeki bir AWS profilinde ya da
AWS_ACCESS_KEY_IDveAWS_SECRET_ACCESS_KEYortam değişkenlerinde tutun. - Asla commit etmeyin; bir depoya eklemeyin, paylaşılan bir pipeline yapılandırmasına yapıştırmayın. Remote Directory'yi de yukarıdaki gibi bir ortam değişkeninde tutun.
- Her hesabın tek bir anahtarı vardır ve süresi dolmaz. Sızdığını düşünüyorsanız ya da değişmesi gerekiyorsa destek ekibimizle iletişime geçin.
Elle kalan kısım gönderimdir. Yüklemeden sonra işi yine web panosundan, Client App'ten veya bir DCC eklentisinden gönderirsiniz.
Adım 4: Gönderim Devrini Kısa ve Tekrarlanabilir Yapın
Gönderim, bir kişinin formu tıklayarak doldurmasıdır; bu yüzden formu işin kolay kısmı yapın. Doğrulama adımı, manifestin yanına küçük bir devir sayfası da yazsın: sahne dosyası, kamera, kare aralığı, çözünürlük, çıktı formatı, render motoru ve karelerin düşeceği yerel klasör. Gönderen kişi değerleri hatırlamak yerine kopyalar; Adım 5'teki izleyici de aynı sayfayı okur, böylece ikisi birbirinden ayrışamaz.
Zinciri otomatikleştirmeyi kolaylaştıran üç kural:
- Çekim ve sürüm başına bir klasör (
shot010_v003/), sahne dosyası kökte. Ön kontrol, manifest, yükleme hedefi ve devir sayfası hep bu ada dayanır. - Çıktı adlarında sıfırla doldurulmuş kare numaraları (
shot010.1001.exr). Bir izleyici, ayrıştıramadığı bir aralığı doğrulayamaz. - İş başına öngörülebilir bir indirme klasörü. Client App, ayarlarında belirlenen varsayılan bir yola indirir ve gönderirken yolu iş başına geçersiz kılabilirsiniz. Onu çekimin kendi render klasörüne yönlendirin.
3ds Max, Maya ve Cinema 4D'de gönderme eklentisi kare aralığını, çıktı yolunu ve render ayarlarını açık sahneden okur, iş formunu önceden doldurur ve kendi varlık kontrolünü çalıştırır. Blender, Houdini ve After Effects için DCC içi bir eklenti yoktur; bu işler Client App veya web panosu üzerinden gider. Hangi yolla olursa olsun Scene Analysis, iş ücretlendirilmeden önce çalışır; script'leriniz bu kapının sizi daha nadir durdurmasını sağlar.
Adım 5: Dönen Kareleri Doğrulayın
Client App çalışırken ve otomatik indirme açıkken (varsayılan), her kare farm'da biter bitmez makinenize iner; S3 erişiminde ise yerel klasörü kendi çalıştırdığınız aws s3 sync doldurur. Her iki durumda da soru, "hepsinin sağlam geldiğini nasıl bilirim" olur. Bir izleyici bunu yalnızca yerel dosyalardan yanıtlar: bir kare, ancak boyutu iki yoklama arasında değişmeyi bıraktığında ve dosya başlığı geçerli olduğunda tamamlanmış sayılır.
# watch_frames.py: verify frames arriving in a local folder. Reads local disk only.
import re
import time
from pathlib import Path
MAGIC = {".exr": b"\x76\x2f\x31\x01", ".png": b"\x89PNG\r\n\x1a\n"}
def header_ok(path: Path) -> bool:
magic = MAGIC.get(path.suffix.lower())
with open(path, "rb") as f:
head = f.read(8)
return head.startswith(magic) if magic else len(head) > 0
def watch(job_dir: Path, first: int, last: int, poll: int = 60, give_up_hours: float = 24,
name_re: str = r"\.(\d{4,})\.(exr|png)$") -> list:
# name_re: default matches any frame-numbered file. Anchor it to one pass's file
# prefix (e.g. r"^shot010_beauty\.(\d{4,})\.(exr)$") when the job writes render
# elements or AOVs as separate files, so this watcher tracks a single pass.
pattern = re.compile(name_re, re.IGNORECASE)
expected = set(range(first, last + 1))
last_size, done = {}, {}
deadline = time.time() + give_up_hours * 3600
while True:
for p in job_dir.rglob("*"):
m = pattern.search(p.name) if p.is_file() else None
if not m or int(m.group(1)) not in expected or int(m.group(1)) in done:
continue
size = p.stat().st_size
if size > 0 and last_size.get(p) == size and header_ok(p):
done[int(m.group(1))] = p # stable across two polls, valid header
last_size[p] = size
missing = sorted(expected - done.keys())
print(f"{len(done)}/{len(expected)} frames verified, {len(missing)} outstanding")
if not missing:
return [done[f] for f in sorted(done)]
if time.time() > deadline:
raise TimeoutError(f"frames still missing: {missing[:20]}")
time.sleep(poll)
Arama özyinelemelidir; bu yüzden kareler, indirmenin kullandığı alt klasör düzeni ne olursa olsun adlarına göre bulunur. İş tamamlanmış görünüp izleyici hâlâ boşluk bildirdiğinde, Client App'te o iş için eksik kareleri yeniden indiren Sync output'u kullanın (ya da aws s3 sync'i yeniden çalıştırın) ve izleyicinin tekrar çalışmasına izin verin; bir karenin boyutu kısa görünüyorsa da aynısını yapın, çünkü takılmış kısmi bir indirme de sabit görünebilir. Yoklama yerine olayları tercih ediyorsanız, watchdog paketi işletim sisteminin dosya değişikliği bildirimlerini sarmalar; her iki durumda da kararlılık kontrolünü koruyun. Bir iş render elementlerini veya AOV'leri ayrı dosyalar olarak yazıyorsa, geçiş başına bir izleyici çalıştırın; aksi halde biten bir geçiş, aynı numaralı eksik bir beauty karesini maskeleyebilir.
Adım 6: Render Sonrası Yerel Adımlar
İzleyici doğrulanmış bir liste döndürdüğünde geri kalanı sıradan pipeline kodudur:
import subprocess
def encode_review(frames_dir, pattern, start, out, fps=24): # pattern e.g. "shot010.%04d.png"
subprocess.run(["ffmpeg", "-y", "-framerate", str(fps), "-start_number", str(start),
"-i", f"{frames_dir}/{pattern}", "-vf", "scale=trunc(iw/2)*2:trunc(ih/2)*2",
"-c:v", "libx264", "-pix_fmt", "yuv420p", "-crf", "18", str(out)], check=True)
Kopyalamaya değer birkaç alışkanlık:
- Ekrana göre (display-referred) karelerden kodlayın. PNG veya JPEG doğrudan bir inceleme videosuna gidebilir. Lineer EXR önce renk pipeline'ınızı (genellikle bir OCIO dönüşümü) gerektirir; aksi halde video koyu ve düz görünür.
- Manifesti karelerle birlikte arşivleyin. Altı ay sonra "bu render'ı hangi dokular üretti" sorusu tek bir dosya uzağınızdadır.
- Gerçeklerle bildirim yapın. Kare sayısı, senkronizasyon gerektiren kareler, toplam boyut ve inceleme videosunun yolu; stüdyo sohbetinize veya takip aracınıza gönderilir.
- Kendi kopyanızı kayıt arşivi olarak tutun. Farm'daki dosyalar, işlerinizi çalıştırmak ve sonuçlarınızı indirmenize imkân tanımak için gereken süre boyunca saklanır; sabit bir otomatik silme süresi yoktur ve siz istediğinizde sileriz. Bu bir yedekleme planı değildir; yerel arşiviniz öyledir.
Yerel Parçaları Zamanlamak
Bunların hiçbiri yeni bir zamanlayıcı gerektirmez. Linux'ta cron, macOS'ta launchd veya Windows'ta Task Scheduler, her akşam "hazır" işaretli projelerde ön kontrolü, manifesti ve AWS CLI yüklemesini çalıştırabilir; böylece biri gönderim için oturmadan önce dosyalar SRF Space'inizde olur. İzleyici gönderimden hemen sonra başlayabilir ya da Adım 4'teki devir sayfalarından beslenen bir izleme listesi üzerinde tarayıcı olarak çalışabilir.
Planlanması gereken bir bağımlılık: otomatik indirme yalnızca Client App, uyanık ve çevrimiçi bir makinede çalışırken gerçekleşir. Windows'ta ana pencere kapatıldıktan sonra da transferleri sürdüren bir arka plan servisi kurar. Onu ya da zamanlanmış aws s3 sync'inizi gece boyunca açık kalan bir makinede çalıştırın.
Özet: Neyi, Nasıl Otomatikleştirmeli
| Aşama | Farm'ımızda bugün script'lenebilir mi? | Nasıl |
|---|---|---|
| Sahne doğrulama (eksik ve mutlak yollar) | Evet | DCC içinde Python (bpy, maya.cmds, pymxs, c4d, hou) |
| Proje klasöründe ön kontrol | Evet | Yerel script; arşivlerde, eksik sahnede, sıfır baytlık dosyalarda engelle |
| Manifest ve değişiklik farkı | Evet | Dosya başına SHA-256, projenin yanında JSON |
| Farm'a yükleme | Evet, S3 erişimi ile | Cloud Direct Connect'ten alınan anahtarla AWS CLI (aws s3 cp --recursive veya aws s3 sync); elle seçenekler web yüklemesi (yaklaşık 2 GB'ın üzerinde yavaş, yaklaşık 5 GB'ın üzerinde güvenilmez) ve Client App (devam ettirilebilir, paralel parçalar) |
| İş gönderimi | Hayır | Web panosu, Client App ya da 3ds Max, Maya, Cinema 4D eklentisi; herkese açık API yol haritasında |
| Biten karelerin indirilmesi | Evet, S3 erişimi ile ya da sizin yerinize halledilir | SuperRendersOutput/<jobId>/ klasöründen aws s3 sync; ya da kare kare Client App otomatik indirmesi; ya da web indirmesi |
| Kare doğrulama | Evet | Yerel izleyici: boyut sabit, başlık geçerli, aralığın tamamı mevcut |
| Kodlama, arşivleme, bildirim | Evet | ffmpeg, dosya kopyalama, sohbetiniz veya takip aracınız |
Her iki ucu da otomatikleştirin, ortadaki adımı kısa ve bilinçli tutun ve dönen her şeyi doğrulayın. Projelerinizin çoğu Blender sahnesiyse, Blender bulut render farm sayfamız bu işlerin bizim tarafımızda nasıl çalıştığını, Client App belgeleri ve gönderme eklentisi belgeleri ise elle yapılan adımları ayrıntılı biçimde anlatır.
SSS
Q: Render farm'a bir Python script'iyle proje yükleyebilir miyim?
A: Evet, S3 erişimi ile. Hesabınızda Cloud Direct Connect altında bir erişim anahtarı oluşturun, AWS CLI'yi bu anahtarla yapılandırın (bölge ap-southeast-1) ve script'iniz sıkıştırılmamış proje klasörü için Remote Directory'nize aws s3 cp --recursive veya aws s3 sync çalıştırsın. Bozuk bir projenin hiç yüklenmemesi için önce ön kontrolünüzü çalıştırın. İşi sonrasında göndermek yine elle yapılır.
Q: S3 erişimini mi yoksa Client App'i mi kullanmalıyım? A: Transferler bir script'ten ya da zamanlayıcıdan çalışacaksa veya ekibiniz zaten Cyberduck gibi bir S3 istemcisiyle çalışıyorsa S3 erişimini kullanın. Yüklemeyi bir kişi elle yapıyorsa Client App'i kullanın: büyük transferleri bağlantı koptuktan sonra sürdürür, işleri gönderir ve biten kareleri bittikçe otomatik olarak indirir. İkisi iyi birleşir: script'li transferler için S3 erişimi, gönderim için Client App.
Q: İş hattımdan render işi göndermek için bir API veya SDK var mı? A: Bugün yok. İşler web panosundan, Client App'ten ya da 3ds Max, Maya veya Cinema 4D içindeki gönderme eklentisinden gönderilir. Programatik gönderim için herkese açık bir API yol haritamızda ama mevcut değil; bu yüzden otomasyonu sahip olduğunuz aşamaların etrafında kurun. İş hattınız buna takılıyorsa kullanım senaryonuzu destek ekibimize iletin.
Q: Farm, büyük transferler için SFTP veya FTP erişimi sunuyor mu? A: Hayır. Yüklemeler, indirmeler veya kiralık makineler için bir SFTP ya da FTP hizmeti işletmiyoruz. Büyük projeler, devam ettirilebilir paralel parçalarla yükleyen Client App üzerinden ya da Cyberduck veya AWS CLI ile S3 erişimi üzerinden gider. Biten kareler Client App otomatik indirmesi, web indirmesi veya S3 erişimi ile gelir.
Q: Tüm karelerimin geri geldiğini nasıl anlarım?
A: İşin Client App tarafından otomatik indirildiği klasörde ya da aws s3 sync çıktınızın yazıldığı klasörde bir izleyici çalıştırın. Bir kareyi yalnızca boyutu iki kontrol arasında sabit kaldığında ve başlığı geçerli olduğunda tamamlanmış sayın, ardından doğrulanan kümeyi beklenen aralıkla karşılaştırın. İş tamamlanmış ama kareler hâlâ eksikse, Client App'te Sync output'u kullanın ya da senkronizasyonu yeniden çalıştırın.
Q: Yüklemeden önce zaman kazanmak için projeyi zip'lemeli miyim? A: Hayır. Farm arşivleri açmaz (.zip, .rar, .7z, .tar, .tar.gz), bu yüzden bir arşivin içindeki hiçbir şey render edilmez. Hangi yükleme yolunu kullanırsanız kullanın, proje klasörünü sıkıştırılmamış olarak, sahne dosyası ve başvurulan her varlık yerinde olacak şekilde yükleyin.
Q: Render edilen kareler farm'da ne kadar süre saklanır? A: Sabit bir otomatik silme süresi yoktur. Dosyalar, işlerinizi çalıştırmak ve sonuçlarınızı indirmenize imkân tanımak için gereken süre boyunca saklanır ve siz istediğinizde sileriz. Kendi depolama alanınızı kayıt arşivi olarak görün ve karelerin bittikçe diskinize ulaşması için Client App otomatik indirmesini kullanın.
About Alice Harper
Blender and V-Ray specialist. Passionate about optimizing render workflows, sharing tips, and educating the 3D community to achieve photorealistic results faster.



