deniz.in

Piyasalar

Hava durumu

Hava durumu yükleniyor

· kaynak dev.to (home feed)

Cloudflare Workers, asenkron Whisper transkripsiyonu için Modal GPU'larla eşleşiyor

Bir dev.to anlatımı, ScribeToAny'nin Cloudflare Workers ön ucunun arkasında Whisper'ı Modal GPU'larda nasıl çalıştırdığını anlatıyor: presigned R2 yüklemeleri, fire-and-forget HTTP spawn'lar ve imzalı, idempotent webhook'lar.

Cloudflare Workers, asenkron Whisper transkripsiyonu için Modal GPU'larla eşleşiyor

Kısıtlama

Cloudflare Workers, kısa ve istek odaklı işler için tasarlanmıştır: bir Worker gelen istekle uyanır, mütevazı bir CPU bütçesi alır, hızlıca yanıt verip ortadan kaybolması beklenir. dev.to'da yayımlanan bir yazıya göre bu yapı, yazarın transkripsiyon uygulaması ScribeToAny'nin ihtiyacıyla tamamen çelişiyor. On dakikalık bir podcast'i Whisper ile çalıştırmak, bir Worker'ın barındıramayacağı dakikalar süren bir GPU işi; üstelik Worker bu işi normal yoldan bile başlatamıyor, çünkü Modal'ın Python SDK'sı platforma gRPC üzerinden erişiyor ve Workers bu tür kalıcı bir bağlantıyı sürdüremiyor. Açık çözüm — transkripsiyonun bitmesini bekleyip metni döndürmek — daha başlangıçta başarısız oluyor.

Modal'ı bir HTTP uç noktası olarak ele almak

Yazarın cevabı, Modal'ı bir SDK olarak değil, düz bir HTTP uç noktası olarak ele almak. Modal, gerçek GPU fonksiyonunu başlatıp hemen dönen bir web endpoint'i açabiliyor ve bu, bütün entegrasyonu birkaç saniyenin altındaki çağrıya indiriyor:

  • Tarayıcı, medyayı doğrudan R2'ye presigned PUT URL'i ile yüklüyor; dosya hiçbir zaman Worker üzerinden geçmiyor.
  • Worker, o nesne için presigned bir okuma URL'i üretiyor, atomik bir eşzamanlılık kilidi arkasında kuyrukta bekleyen bir iş satırı yazıyor ve Modal'ın web endpoint'ine tek bir POST atıyor. Modal bir call id ile onaylıyor ve GPU işini arka planda başlatıyor.
  • Motor işi bitirdiğinde, başarısız olduğunda veya ilerleme bildirmek istediğinde, Worker üzerindeki bir webhook'a paylaşımlı bir sırla imzalanmış bir POST gönderiyor.
  • Ön uç iş satırını yokluyor ve satır done durumuna geçtiğinde güncelliyor.

Spawn isteği Modal'ın proxy auth şemasıyla doğrulanıyor — gövdede değil, header olarak gönderilen bir anahtar ve sır — ve callback URL'ini taşıyor, böylece GPU tarafının uygulamanın topolojisini bilmesine gerek kalmıyor. Webhook imza sırrı, Modal'ın secrets mekanizmasıyla önceden paylaşılıyor ve hiçbir yönde bir istek gövdesinde görünmüyor.

Yüklemeler Worker'ı tamamen atlıyor

Medyaya hiçbir fayda sağlamadan CPU yakacağı için Worker'dan hiç geçmiyor. Yükleme akışı niyet-öncelikli: presigned URL verilmeden önce pending durumunda bir satır yazılıyor, böylece yarım bırakılmış bir yükleme bile sonradan temizlenebilecek bir iz bırakıyor. İstemcinin PUT'u başarılı olduğunda, satırı pending'den uploaded durumuna çeviren ve dosya boyutunu R2'nin HEAD metadata'sından düzelten bir finalize adımını çağırıyor — istemcinin bildirdiği bayt sayısına asla güvenilmiyor.

Doğrula, sonra idempotent uygula

İlginç işin yapıldığı yer webhook. Motor, ham gövdeyi HMAC-SHA256 ile imzalayıp hex özetini X-Webhook-Signature header'ında gönderiyor; Worker da WebCrypto ile (Workers üzerinde Node crypto yoktur) timing-safe bir karşılaştırmayla doğruluyor. Yazarın vurguladığı bir tuzak: imzanın ham baytlar üzerinden hesaplanması gerekiyor. Parse edilmiş JSON'u yeniden seri hale getirmek anahtar sırasını bozup boşlukları değiştirir, dolayısıyla imza asla eşleşmez — handler ham metni okuyup parse etmeden önce doğruluyor.

Yeterince hızlı onaylanmayan bir webhook tekrar deneneceği için, sonuçları uygulamak idempotent olmalı. Kural tek cümle: bir iş done veya failed gibi terminal duruma ulaştığında, tekrarlar no-op'tur. HTTP durum kodları, motorun yeniden deneme davranışını yönlendirmek için seçiliyor. Bozuk veya eksik imza 401 alıyor ve tamamen reddediliyor. Bilinmeyen bir job id 200 alıyor; bu, yukarı taşınacak bir hata olarak değil, göndericinin tekrar denemeyi bırakması gereken bir ölü mektup olarak ele alınıyor. Başarıyla uygulanan bir callback 200 döndürüyor, Worker'ın kendi veritabanındaki bir hata ise motora yeniden denemesini söylemek için 500 döndürüyor.

Kayıp callback'ler için güvence mekanizmaları

Mutlu yol kodun yalnızca yaklaşık üçte biri, diye not düşüyor yazar. Motor çökerse veya bir callback kaybolursa bir iş sonsuza dek transcribing durumunda kalırdı; bu yüzden bir cron trigger'ı durumu uzlaştırıyor: zaman aşımını aşmış sessiz işler failed olarak işaretleniyor ve aynı süpürme, finalize edilmemiyor kalmış öksüz R2 yüklemelerini de topluyor. Bir liveness probe, Modal'a bir çağrının hâlâ çalışıp çalışmadığını da sorabiliyor ve bilinçli olarak üç değerli bir cevap döndürüyor — çalışıyor, terminal durumda veya probe'un bilmediği anlamına gelen null.

Neden önemli

Workers gibi edge runtime'lar ucuz, hızlı ve küresel dağıtılmış istek işlemesi sunar ama uzun süren ve GPU bağlantılı işlere kapıyı kapatır; gRPC veya kalıcı soket varsayan platform SDK'ları da bunlara taşınmaz. Burada anlatılan pattern — doğrudan object storage'a yüklemeler, düz HTTP üzerinden fire-and-forget spawn, imzalı ve idempotent uygulanan webhook'lar ve cron tabanlı uzlaştırma — kuyruk veya ek altyapı kurmadan bu boşluğu köprüler. Aynı zamanda asenkron sistem hijyeni için kompakt bir kontrol listesi: parse etmeden önce ham baytları hash'le, ölü mektupları onayla ki göndericiler tekrar denemeyi bıraksın, istemci iddialarına değil storage metadata'sına güven ve her callback'in iki kez veya hiç gelmeyebileceğini varsay.

  • #cloudflare-workers
  • #modal
  • #serverless
  • #webhooks
  • #whisper
  • #gpu