mcpField
F
fal-optimization

fal-optimization

github.com/josiahsiegel云与 DevOps5970 次安装19 周前更新
代码仓库

关于 fal-optimization

fal-optimization 是面向 fal.ai 集成开发者的技能,帮助改善生成性能并管理成本。内容涵盖客户端请求模式、模型与图像尺寸选择、缓存、webhook 和无服务器扩缩配置。

主要功能

  1. 01并行请求与批处理
  2. 02使用队列执行和流式传输
  3. 03以 webhook 替代轮询
  4. 04缓存可复现结果
  5. 05调整模型、图像尺寸和步数
  6. 06配置无服务器扩缩

适用场景

  1. 01降低生成工作流延迟
  2. 02减少 API 和无服务器成本
  3. 03选择轮询或 webhook 处理
  4. 04扩展 fal.ai 工作负载

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/josiahsiegel/claude-plugin-marketplace --skill fal-optimization

安装后在 Claude Code 中输入/fal-optimization确认已加载。

详细介绍

快速参考

优化技术影响
并行请求使用 Promise.all() 分批处理吞吐量提升 5-10 倍
避免轮询使用 Webhook减少 API 调用
按种子缓存存储 prompt+seed 结果避免重新生成
调整图像尺寸使用所需分辨率降低成本
减少步骤减少推理步骤更快、更便宜
模型级别开发生产
图像FLUX SchnellFLUX.2 Pro
视频Runway TurboKling 2.6 Pro
无服务器配置成本优化延迟优化
min_concurrency01+
keep_alive120600+
machine_type满足需求的最小规格更高级别

何时使用此技能

适用于性能和成本优化:

  • 缩短生成延迟
  • 降低 API 成本
  • 实现并行处理
  • 在轮询和 Webhook 之间进行选择
  • 配置无服务器扩缩

相关技能:

  • 关于 API 模式:参见 fal-api-reference
  • 关于模型选择:参见 fal-model-guide
  • 关于无服务器配置:参见 fal-serverless-guide

fal.ai 性能和成本优化

优化性能、降低成本并扩展 fal.ai 集成的策略。

性能优化

客户端优化
1. 使用基于队列的执行

生成任务始终优先使用 subscribe(),而不是 run():

// Recommended: Queue-based with progress tracking
const result = await fal.subscribe("fal-ai/flux/dev", {
  input: { prompt: "test" },
  logs: true,
  onQueueUpdate: (update) => {
    // Show progress to users
    if (update.status === "IN_PROGRESS") {
      console.log("Generating...");
    }
  }
});

// Only use run() for fast endpoints (< 30s)
const quickResult = await fal.run("fal-ai/fast-sdxl", {
  input: { prompt: "quick test" }
});
2. 并行请求

并发处理多个请求:

// JavaScript - Parallel execution
async function generateBatch(prompts: string[]) {
  const results = await Promise.all(
    prompts.map(prompt =>
      fal.subscribe("fal-ai/flux/dev", {
        input: { prompt }
      })
    )
  );
  return results;
}

// With rate limiting
async function generateBatchWithLimit(prompts: string[], limit = 5) {
  const results = [];
  for (let i = 0; i < prompts.length; i += limit) {
    const batch = prompts.slice(i, i + limit);
    const batchResults = await Promise.all(
      batch.map(prompt =>
        fal.subscribe("fal-ai/flux/dev", { input: { prompt } })
      )
    );
    results.push(...batchResults);
    // Small delay between batches
    if (i + limit < prompts.length) {
      await new Promise(r => setTimeout(r, 100));
    }
  }
  return results;
}
# Python - Async parallel
import asyncio
import fal_client

async def generate_batch(prompts: list[str]) -> list[dict]:
    tasks = [
        fal_client.run_async("fal-ai/flux/dev", arguments={"prompt": p})
        for p in prompts
    ]
    return await asyncio.gather(*tasks)

# With semaphore for rate limiting
async def generate_batch_limited(prompts: list[str], limit: int = 5):
    semaphore = asyncio.Semaphore(limit)

    async def generate_one(prompt: str):
        async with semaphore:
            return await fal_client.run_async(
                "fal-ai/flux/dev",
                arguments={"prompt": prompt}
            )

    return await asyncio.gather(*[generate_one(p) for p in prompts])
3. 使用流式传输实现实时反馈

使用流式传输逐步输出:

// Show incremental progress
const stream = await fal.stream("fal-ai/flux/dev", {
  input: { prompt: "A landscape" }
});

for await (const event of stream) {
  updateProgressUI(event);
}

const result = await stream.done();
4. 交互式应用使用 WebSocket

对于有持续输入的实时应用:

const connection = fal.realtime.connect("fal-ai/lcm-sd15-i2i", {
  connectionKey: `user-${userId}`,
  throttleInterval: 128,  // Debounce rapid inputs
  onResult: (result) => {
    displayImage(result.images[0].url);
  }
});

// Send updates as user types/draws
inputElement.addEventListener('input', (e) => {
  connection.send({
    prompt: e.target.value,
    image_url: currentImage
  });
});
服务端优化(无服务器)
1. 高效加载模型
class OptimizedApp(fal.App):
    machine_type = "GPU-A100"
    requirements = ["torch", "transformers", "accelerate"]

    volumes = {
        "/data": fal.Volume("model-cache")
    }

    def setup(self):
        import torch
        from transformers import AutoModelForCausalLM

        # Use fp16 for faster inference and less memory
        self.model = AutoModelForCausalLM.from_pretrained(
            "model-name",
            torch_dtype=torch.float16,
            device_map="auto",
            cache_dir="/data/models"  # Persistent cache
        )

        # Enable optimizations
        if hasattr(self.model, 'enable_attention_slicing'):
            self.model.enable_attention_slicing()
2. 减少冷启动
class WarmApp(fal.App):
    machine_type = "GPU-A100"
    keep_alive = 600      # 10 minutes warm
    min_concurrency = 1   # Always keep one ready

    # Use lightweight health check
    @fal.endpoint("/health")
    def health(self):
        return {"status": "ok"}
3. 内存管理
class MemoryEfficientApp(fal.App):
    def setup(self):
        import torch

        # Use mixed precision
        self.model = load_model(torch_dtype=torch.float16)

        # Enable memory-efficient attention (if using transformers)
        self.model.enable_xformers_memory_efficient_attention()

    def teardown(self):
        # Clean up GPU memory
        import torch
        if hasattr(self, 'model'):
            del self.model
        torch.cuda.empty_cache()

    @fal.endpoint("/generate")
    def generate(self, request):
        import torch

        with torch.inference_mode():  # Disable gradient tracking
            result = self.model(request.input)

        return result

成本优化

1. 选择合适的模型
需求更便宜的选项高级选项
快速迭代FLUX Schnell ($)FLUX.1 Dev ($$)
生产FLUX.1 Dev ($$)FLUX.2 Pro ($$$)
视频预览Runway Turbo ($$)Kling Pro ($$$)
// Development: Use fast/cheap models
const preview = await fal.subscribe("fal-ai/flux/schnell", {
  input: { prompt: "test", num_inference_steps: 4 }
});

// Production: Use quality models
const final = await fal.subscribe("fal-ai/flux-2-pro", {
  input: { prompt: "test" }
});
2. 优化图像尺寸

按所需尺寸生成,不要使用更大的尺寸:

// Don't generate larger than needed
const result = await fal.subscribe("fal-ai/flux/dev", {
  input: {
    prompt: "test",
    // Use preset sizes
    image_size: "square_hd",  // 1024x1024

    // Or specific dimensions
    image_size: { width: 800, height: 600 }
  }
});
3. 减少推理步骤

找到满足可接受质量的最少步骤数:

// Quick previews: fewer steps
const preview = await fal.subscribe("fal-ai/flux/dev", {
  input: {
    prompt: "test",
    num_inference_steps: 15  // Faster, slightly lower quality
  }
});

// Final render: more steps
const final = await fal.subscribe("fal-ai/flux/dev", {
  input: {
    prompt: "test",
    num_inference_steps: 28  // Default, high quality
  }
});
4. 高流量场景使用 Webhook

使用 Webhook 避免轮询开销:

// Instead of polling
const result = await fal.subscribe("fal-ai/flux/dev", {
  input: { prompt: "test" },
  pollInterval: 1000  // Polling = more API calls
});

// Use webhooks
const { request_id } = await fal.queue.submit("fal-ai/flux/dev", {
  input: { prompt: "test" },
  webhookUrl: "https://your-server.com/webhook"
});
// No polling needed - result delivered to webhook
5. 缓存结果

使用种子生成可复现的输出:

// Cache key based on prompt + seed
const cacheKey = `${prompt}-${seed}`;
const cached = await cache.get(cacheKey);

if (cached) {
  return cached;
}

const result = await fal.subscribe("fal-ai/flux/dev", {
  input: { prompt, seed }
});

await cache.set(cacheKey, result);
return result;
6. 无服务器成本优化
class CostOptimizedApp(fal.App):
    machine_type = "GPU-A10G"   # Cheaper than A100 if sufficient
    min_concurrency = 0         # Scale to zero when not used
    keep_alive = 120            # Shorter keep-alive

    # Use appropriate GPU for model size
    # T4: < 16GB VRAM models
    # A10G: 16-24GB VRAM models
    # A100: 24-80GB VRAM models

扩展策略

1. 横向扩展
class ScalableApp(fal.App):
    machine_type = "GPU-A100"
    min_concurrency = 2    # Always have 2 instances
    max_concurrency = 20   # Scale up to 20

    # fal handles auto-scaling based on queue depth
2. 请求批处理
class BatchApp(fal.App):
    @fal.endpoint("/batch")
    def batch_generate(self, prompts: list[str]) -> list[dict]:
        # Process multiple prompts in one request
        results = []
        for prompt in prompts:
            result = self.model(prompt)
            results.append(result)
        return results
3. 优先级队列

针对不同优先级使用不同的端点:

class PriorityApp(fal.App):
    machine_type = "GPU-A100"

    @fal.endpoint("/high-priority")
    def high_priority(self, request):
        # Separate endpoint for important requests
        return self.process(request)

    @fal.endpoint("/standard")
    def standard(self, request):
        # Standard processing
        return self.process(request)

监控和调试

1. 添加日志记录
import logging

class MonitoredApp(fal.App):
    def setup(self):
        logging.basicConfig(level=logging.INFO)
        self.logger = logging.getLogger(__name__)
        self.logger.info("App starting up")
        # Load model
        self.logger.info("Model loaded successfully")

    @fal.endpoint("/generate")
    def generate(self, request):
        import time
        start = time.time()

        result = self.process(request)

        elapsed = time.time() - start
        self.logger.info(f"Request processed in {elapsed:.2f}s")

        return result
2. 跟踪指标
// Client-side timing
const start = Date.now();

const result = await fal.subscribe("fal-ai/flux/dev", {
  input: { prompt: "test" },
  onQueueUpdate: (update) => {
    if (update.status === "IN_QUEUE") {
      console.log(`Queue position: ${update.queue_position}`);
    }
  }
});

const elapsed = Date.now() - start;
console.log(`Total time: ${elapsed}ms`);

// Track in your analytics
analytics.track("fal_generation", {
  model: "flux/dev",
  elapsed_ms: elapsed,
  queue_time_ms: result.timings?.queue,
  inference_time_ms: result.timings?.inference
});
3. 错误监控
try {
  const result = await fal.subscribe("fal-ai/flux/dev", {
    input: { prompt: "test" }
  });
} catch (error) {
  // Log to error tracking service
  errorTracker.captureException(error, {
    tags: {
      model: "flux/dev",
      type: error.constructor.name
    },
    extra: {
      status: error.status,
      body: error.body
    }
  });

  // Handle gracefully
  return fallbackResult();
}

检查清单

投入生产前
  • 使用基于队列的执行(subscribe)
  • 根据使用场景选择了合适的模型
  • 已优化图像尺寸
  • 已实现错误处理
  • 已设置速率限制
  • 已制定缓存策略
无服务器部署
  • 根据模型大小选择了正确的机器类型
  • 在 setup() 中加载模型,而不是按请求加载
  • 为大型模型使用持久卷
  • 已正确配置密钥
  • 健康检查端点
  • 已启用日志记录
成本管理
  • 已启用缩至零(min_concurrency = 0)
  • keep_alive 设置合适
  • 开发时使用更便宜的模型
  • 尽可能进行批处理
  • 使用 Webhook 回调,而不是轮询
监控
  • 延迟跟踪
  • 错误率监控
  • 成本跟踪
  • 队列深度告警

评论

支持 Markdown