การ deploy โมเดล AI ขนาดใหญ่ (Large Language Model) ใน production environment ไม่ใช่เรื่องง่าย หากไม่มีระบบ monitoring ที่ดี คุณอาจเสียเงินมากเกินจำเป็น หรือ服务质量 (QoS) ตกต่ำจนผู้ใช้ไม่พอใจ ในบทความนี้เราจะมาดูวิธีการ monitor ตัวชี้วัดสำคัญ 3 ตัว ได้แก่ GPU Utilization, Throughput และ Queue Latency พร้อมโค้ดตัวอย่างที่ใช้งานได้จริง

ทำไมต้อง Monitor LLM Inference?

จากประสบการณ์ในการ operate LLM API มาหลายปี พบว่าปัญหาส่วนใหญ่ที่ทำให้ระบบล่มหรือทำงานช้า ไม่ใช่เพราะโมเดลมีปัญหา แต่เป็นเพราะ:

เปรียบเทียบบริการ LLM API

บริการ GPU Utilization Throughput (req/s) Queue Latency ราคา (GPT-4o/MTok) เครดิตฟรี
HolySheep AI 95%+ (dedicated) 50-200+ <50ms $8 ✅ มี
API อย่างเป็นทางการ N/A (shared) Variable 100-500ms+ $15
บริการรีเลย์อื่น 60-80% 20-80 80-300ms $10-12 ✅ บางราย

HolySheep AI ให้บริการด้วย GPU แบบ dedicated ทำให้ได้ throughput สูงและ latency ต่ำกว่าบริการอื่นอย่างเห็นได้ชัด สมัครที่นี่ เพื่อรับเครดิตฟรีเมื่อลงทะเบียน

1. GPU Utilization Monitoring

GPU Utilization คือเปอร์เซ็นต์การใช้งาน GPU ในการประมวลผล หากค่านี้ต่ำ (<70%) แสดงว่าคุณกำลังเสียเงินโดยเปล่าประโยชน์

วิธีตรวจสอบ GPU Utilization

import requests
import time
import psutil
import subprocess
from datetime import datetime

class GPUMonitor:
    """ตรวจสอบ GPU Utilization สำหรับ LLM Inference"""
    
    def __init__(self, api_key: str):
        self.base_url = "https://api.holysheep.ai/v1"
        self.headers = {
            "Authorization": f"Bearer {api_key}",
            "Content-Type": "application/json"
        }
    
    def get_gpu_stats(self) -> dict:
        """ดึงข้อมูล GPU ด้วย nvidia-smi"""
        try:
            result = subprocess.run(
                ['nvidia-smi', '--query-gpu=utilization.gpu,memory.used,memory.total',
                 '--format=csv,noheader,nounits'],
                capture_output=True,
                text=True
            )
            gpu_util, mem_used, mem_total = result.stdout.strip().split(',')
            return {
                "gpu_utilization_percent": float(gpu_util.strip()),
                "memory_used_mb": float(mem_used.strip()),
                "memory_total_mb": float(mem_total.strip()),
                "memory_utilization_percent": (float(mem_used) / float(mem_total)) * 100
            }
        except Exception as e:
            return {"error": str(e)}
    
    def test_inference_load(self, model: str = "gpt-4o", num_requests: int = 10):
        """ทดสอบ inference load และวัด GPU utilization"""
        results = []
        
        for i in range(num_requests):
            start = time.time()
            gpu_before = self.get_gpu_stats()
            
            response = requests.post(
                f"{self.base_url}/chat/completions",
                headers=self.headers,
                json={
                    "model": model,
                    "messages": [{"role": "user", "content": "Say 'test'"}],
                    "max_tokens": 10
                },
                timeout=30
            )
            
            end = time.time()
            gpu_after = self.get_gpu_stats()
            
            results.append({
                "request_id": i + 1,
                "latency_ms": (end - start) * 1000,
                "gpu_util_before": gpu_before.get("gpu_utilization_percent", 0),
                "gpu_util_after": gpu_after.get("gpu_utilization_percent", 0),
                "status": response.status_code
            })
            
            time.sleep(0.1)
        
        avg_gpu_util = sum(r["gpu_util_after"] for r in results) / len(results)
        print(f"📊 Average GPU Utilization: {avg_gpu_util:.2f}%")
        return results

ใช้งาน

monitor = GPUMonitor(api_key="YOUR_HOLYSHEEP_API_KEY") stats = monitor.test_inference_load(num_requests=10) print(f"GPU Stats: {monitor.get_gpu_stats()}")

2. Throughput Measurement

Throughput คือจำนวน request ที่ระบบสามารถประมวลผลได้ต่อวินาที ค่านี้สำคัญมากสำหรับการวางแผน capacity และคำนวณ cost

import requests
import time
import threading
import queue
from concurrent.futures import ThreadPoolExecutor
from typing import List, Dict

class ThroughputMeter:
    """วัด Throughput ของ LLM API"""
    
    def __init__(self, api_key: str):
        self.base_url = "https://api.holysheep.ai/v1"
        self.api_key = api_key
        self.results_queue = queue.Queue()
    
    def single_request(self, request_id: int, model: str) -> Dict:
        """ส่ง request เดียวและวัดเวลา"""
        start = time.time()
        
        try:
            response = requests.post(
                f"{self.base_url}/chat/completions",
                headers={
                    "Authorization": f"Bearer {self.api_key}",
                    "Content-Type": "application/json"
                },
                json={
                    "model": model,
                    "messages": [{"role": "user", "content": "What is AI?"}],
                    "max_tokens": 100
                },
                timeout=60
            )
            
            end = time.time()
            elapsed = (end - start) * 1000  # ms
            
            return {
                "request_id": request_id,
                "status_code": response.status_code,
                "latency_ms": elapsed,
                "success": response.status_code == 200,
                "error": None if response.status_code == 200 else response.text
            }
            
        except requests.exceptions.Timeout:
            return {
                "request_id": request_id,
                "status_code": 408,
                "latency_ms": 60000,
                "success": False,
                "error": "Request timeout"
            }
        except Exception as e:
            return {
                "request_id": request_id,
                "status_code": 500,
                "latency_ms": 0,
                "success": False,
                "error": str(e)
            }
    
    def measure_throughput(
        self,
        model: str = "gpt-4o",
        concurrent_users: int = 10,
        total_requests: int = 100
    ) -> Dict:
        """วัด throughput ด้วย concurrent users"""
        
        print(f"🚀 Starting throughput test: {total_requests} requests, {concurrent_users} concurrent")
        
        start_time = time.time()
        results = []
        
        with ThreadPoolExecutor(max_workers=concurrent_users) as executor:
            futures = [
                executor.submit(self.single_request, i, model)
                for i in range(total_requests)
            ]
            
            for future in futures:
                results.append(future.result())
        
        end_time = time.time()
        total_duration = end_time - start_time
        
        # คำนวณ metrics
        successful = [r for r in results if r["success"]]
        failed = [r for r in results if not r["success"]]
        
        latencies = [r["latency_ms"] for r in successful]
        
        metrics = {
            "total_requests": total_requests,
            "successful_requests": len(successful),
            "failed_requests": len(failed),
            "total_duration_seconds": round(total_duration, 2),
            "throughput_req_per_sec": round(total_requests / total_duration, 2),
            "successful_throughput": round(len(successful) / total_duration, 2),
            "avg_latency_ms": round(sum(latencies) / len(latencies), 2) if latencies else 0,
            "p50_latency_ms": round(sorted(latencies)[len(latencies)//2], 2) if latencies else 0,
            "p95_latency_ms": round(sorted(latencies)[int(len(latencies)*0.95)], 2) if latencies else 0,
            "p99_latency_ms": round(sorted(latencies)[int(len(latencies)*0.99)], 2) if latencies else 0,
            "success_rate_percent": round(len(successful) / total_requests * 100, 2)
        }
        
        return metrics
    
    def print_report(self, metrics: Dict):
        """พิมพ์รายงานผล"""
        print("\n" + "="*50)
        print("📈 THROUGHPUT REPORT")
        print("="*50)
        print(f"Total Requests:     {metrics['total_requests']}")
        print(f"Successful:         {metrics['successful_requests']}")
        print(f"Failed:             {metrics['failed_requests']}")
        print(f"Success Rate:       {metrics['success_rate_percent']}%")
        print(f"Duration:           {metrics['total_duration_seconds']}s")
        print(f"Throughput:         {metrics['throughput_req_per_sec']} req/s")
        print(f"Success Throughput: {metrics['successful_throughput']} req/s")
        print("-"*50)
        print(f"Avg Latency:        {metrics['avg_latency_ms']}ms")
        print(f"P50 Latency:        {metrics['p50_latency_ms']}ms")
        print(f"P95 Latency:        {metrics['p95_latency_ms']}ms")
        print(f"P99 Latency:        {metrics['p99_latency_ms']}ms")
        print("="*50)

ใช้งาน

meter = ThroughputMeter(api_key="YOUR_HOLYSHEEP_API_KEY") metrics = meter.measure_throughput( model="gpt-4o", concurrent_users=20, total_requests=200 ) meter.print_report(metrics)

3. Queue Latency Monitoring

Queue Latency คือเวลาที่ request รอในคิวก่อนได้รับการประมวลผล ค่านี้มักถูก overlook แต่ส่งผลต่อ user experience มาก

import requests
import time
import statistics
from dataclasses import dataclass
from typing import List, Optional

@dataclass
class QueueMetrics:
    """ข้อมูล Queue Latency"""
    request_id: str
    queue_time_ms: float
    processing_time_ms: float
    total_time_ms: float
    queue_position: int
    timestamp: float

class QueueLatencyMonitor:
    """ตรวจสอบ Queue Latency ของ LLM Inference"""
    
    def __init__(self, api_key: str):
        self.base_url = "https://api.holysheep.ai/v1"
        self.api_key = api_key
        self.metrics_history: List[QueueMetrics] = []
    
    def measure_queue_latency(
        self,
        model: str,
        prompt: str,
        priority: int = 0
    ) -> Optional[QueueMetrics]:
        """วัด queue latency ของ request เดียว"""
        
        request_id = f"req_{int(time.time() * 1000)}"
        headers = {
            "Authorization": f"Bearer {self.api_key}",
            "Content-Type": "application/json"
        }
        
        # ส่ง requestพร้อม timestamp
        submit_time = time.time()
        
        try:
            response = requests.post(
                f"{self.base_url}/chat/completions",
                headers=headers,
                json={
                    "model": model,
                    "messages": [{"role": "user", "content": prompt}],
                    "max_tokens": 200,
                    "stream": False
                },
                timeout=120
            )
            
            response_time = time.time()
            
            if response.status_code == 200:
                data = response.json()
                
                # คำนวณ queue time จาก response metadata
                processing_start = data.get("created", submit_time)
                
                # Estimate queue time (response time - submit time - estimated processing)
                estimated_processing = 100  # ms
                queue_time = max(0, (response_time - submit_time) * 1000 - estimated_processing)
                processing_time = (response_time - submit_time) * 1000 - queue_time
                
                metrics = QueueMetrics(
                    request_id=request_id,
                    queue_time_ms=queue_time,
                    processing_time_ms=processing_time,
                    total_time_ms=(response_time - submit_time) * 1000,
                    queue_position=data.get("queue_position", 0),
                    timestamp=submit_time
                )
                
                self.metrics_history.append(metrics)
                return metrics
                
        except Exception as e:
            print(f"Error measuring queue: {e}")
            return None
    
    def monitor_continuous(
        self,
        model: str,
        duration_seconds: int = 60,
        interval_seconds: float = 1.0
    ):
        """ตรวจสอบ queue latency ต่อเนื่อง"""
        
        print(f"📊 Monitoring queue latency for {duration_seconds} seconds...")
        start_time = time.time()
        
        prompts = [
            "Explain quantum computing",
            "What is machine learning?",
            "Define artificial intelligence",
            "Describe neural networks",
            "What are transformers in AI?"
        ]
        
        while time.time() - start_time < duration_seconds:
            prompt = prompts[int(time.time()) % len(prompts)]
            metrics = self.measure_queue_latency(model, prompt)
            
            if metrics:
                queue_status = "🟢" if metrics.queue_time_ms < 50 else \
                              "🟡" if metrics.queue_time_ms < 200 else "🔴"
                print(f"{queue_status} Queue: {metrics.queue_time_ms:.1f}ms | "
                      f"Processing: {metrics.processing_time_ms:.1f}ms | "
                      f"Total: {metrics.total_time_ms:.1f}ms")
            
            time.sleep(interval_seconds)
        
        self.print_queue_summary()
    
    def print_queue_summary(self):
        """พิมพ์สรุป Queue Latency"""
        
        if not self.metrics_history:
            print("No metrics collected")
            return
        
        queue_times = [m.queue_time_ms for m in self.metrics_history]
        total_times = [m.total_time_ms for m in self.metrics_history]
        
        print("\n" + "="*50)
        print("📊 QUEUE LATENCY SUMMARY")
        print("="*50)
        print(f"Total Requests:     {len(self.metrics_history)}")
        print(f"Avg Queue Time:     {statistics.mean(queue_times):.2f}ms")
        print(f"Min Queue Time:     {min(queue_times):.2f}ms")
        print(f"Max Queue Time:     {max(queue_times):.2f}ms")
        print(f"P95 Queue Time:     {statistics.quantiles(queue_times, n=20)[18]:.2f}ms")
        print("-"*50)
        print(f"Avg Total Time:     {statistics.mean(total_times):.2f}ms")
        print(f"P95 Total Time:     {statistics.quantiles(total_times, n=20)[18]:.2f}ms")
        print(f"P99 Total Time:     {statistics.quantiles(total_times, n=100)[98]:.2f}ms")
        print("="*50)

ใช้งาน

monitor = QueueLatencyMonitor(api_key="YOUR_HOLYSHEEP_API_KEY") monitor.monitor_continuous(model="gpt-4o", duration_seconds=30, interval_seconds=2)

Dashboard รวมทุก Metrics

เมื่อรวมทุกอย่างเข้าด้วยกัน คุณจะได้ dashboard ที่ครบถ้วนสำหรับ monitor LLM inference

import requests
import time
import json
from datetime import datetime
from typing import Dict, List

class LLMInferenceDashboard:
    """Dashboard รวมทุก metrics สำหรับ LLM Inference"""
    
    def __init__(self, api_key: str):
        self.api_key = api_key
        self.base_url = "https://api.holysheep.ai/v1"
        self.history: List[Dict] = []
    
    def run_full_diagnostic(self, model: str = "gpt-4o", duration: int = 60):
        """รันการวินิจฉัยแบบเต็มรูปแบบ"""
        
        print("="*60)
        print(f"🔍 LLM INFERENCE DIAGNOSTIC - {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
        print(f"   Model: {model}")
        print("="*60)
        
        # 1. Basic Connectivity Test
        print("\n1️⃣ CONNECTIVITY TEST")
        connectivity = self._test_connectivity(model)
        print(f"   Status: {'✅ OK' if connectivity['success'] else '❌ FAILED'}")
        print(f"   Latency: {connectivity['latency_ms']}ms")
        
        # 2. Load Test
        print("\n2️⃣ LOAD TEST (50 concurrent requests)")
        load_results = self._load_test(model, concurrent=50, total=100)
        print(f"   Throughput: {load_results['throughput']} req/s")
        print(f"   Success Rate: {load_results['success_rate']}%")
        print(f"   Avg Latency: {load_results['avg_latency']}ms")
        print(f"   P95 Latency: {load_results['p95_latency']}ms")
        
        # 3. Queue Test
        print("\n3️⃣ QUEUE LATENCY TEST")
        queue_results = self._queue_test(model, requests=20)
        print(f"   Avg Queue Time: {queue_results['avg_queue']}ms")
        print(f"   Max Queue Time: {queue_results['max_queue']}ms")
        print(f"   Queue Under 50ms: {queue_results['under_50ms_percent']}%")
        
        # 4. Cost Estimation
        print("\n4️⃣ COST ESTIMATION")
        cost = self._estimate_cost(model, daily_requests=10000, avg_tokens=500)
        print(f"   Daily Cost (10K requests): ${cost['daily']:.2f}")
        print(f"   Monthly Cost (300K requests): ${cost['monthly']:.2f}")
        print(f"   Yearly Cost: ${cost['yearly']:.2f}")
        
        # 5. Generate Report
        print("\n" + "="*60)
        print("📋 SUMMARY")
        print("="*60)
        
        overall_score = self._calculate_score(load_results, queue_results)
        print(f"   Overall Score: {overall_score}/100")
        print(f"   Recommendation: {self._get_recommendation(overall_score)}")
        
        # Save to history
        report = {
            "timestamp": datetime.now().isoformat(),
            "model": model,
            "connectivity": connectivity,
            "load": load_results,
            "queue": queue_results,
            "cost": cost,
            "score": overall_score
        }
        self.history.append(report)
        
        return report
    
    def _test_connectivity(self, model: str) -> Dict:
        """ทดสอบการเชื่อมต่อพื้นฐาน"""
        start = time.time()
        try:
            response = requests.post(
                f"{self.base_url}/chat/completions",
                headers={"Authorization": f"Bearer {self.api_key}"},
                json={
                    "model": model,
                    "messages": [{"role": "user", "content": "Hi"}],
                    "max_tokens": 5
                },
                timeout=10
            )
            latency = (time.time() - start) * 1000
            return {
                "success": response.status_code == 200,
                "latency_ms": round(latency, 2),
                "status_code": response.status_code
            }
        except Exception as e:
            return {"success": False, "latency_ms": 0, "error": str(e)}
    
    def _load_test(self, model: str, concurrent: int, total: int) -> Dict:
        """ทดสอบ load"""
        from concurrent.futures import ThreadPoolExecutor
        
        latencies = []
        successes = 0
        
        def single_req(i):
            start = time.time()
            try:
                resp = requests.post(
                    f"{self.base_url}/chat/completions",
                    headers={"Authorization": f"Bearer {self.api_key}"},
                    json={
                        "model": model,
                        "messages": [{"role": "user", "content": f"Test {i}"}],
                        "max_tokens": 50
                    },
                    timeout=30
                )
                return (time.time() - start) * 1000, resp.status_code == 200
            except:
                return (time.time() - start) * 1000, False
        
        start = time.time()
        with ThreadPoolExecutor(max_workers=concurrent) as ex:
            results = list(ex.map(single_req, range(total)))
        
        duration = time.time() - start
        latencies = [r[0] for r in results]
        successes = sum(1 for r in results if r[1])
        
        sorted_lat = sorted(latencies)
        return {
            "throughput": round(total / duration, 2),
            "success_rate": round(successes / total * 100, 1),
            "avg_latency": round(sum(latencies) / len(latencies), 2),
            "p50_latency": round(sorted_lat[len(sorted_lat)//2], 2),
            "p95_latency": round(sorted_lat[int(len(sorted_lat)*0.95)], 2),
            "p99_latency": round(sorted_lat[int(len(sorted_lat)*0.99)], 2)
        }
    
    def _queue_test(self, model: str, requests: int) -> Dict:
        """ทดสอบ queue"""
        queue_times = []
        
        for _ in range(requests):
            start = time.time()
            try:
                resp = requests.post(
                    f"{self.base_url}/chat/completions",
                    headers={"Authorization": f"Bearer {self.api_key}"},
                    json={
                        "model": model,
                        "messages": [{"role": "user", "content": "Queue test"}],
                        "max_tokens": 30
                    },
                    timeout=30
                )
                total_time = (time.time() - start) * 1000
                queue_time = max(0, total_time - 200)  # estimate
                queue_times.append(queue_time)
            except:
                pass
            time.sleep(0.1)
        
        under_50 = sum(1 for q in queue_times if q < 50)
        return {
            "avg_queue": round(sum(queue_times) / len(queue_times), 2) if queue_times else 0,
            "max_queue": round(max(queue_times), 2) if queue_times else 0,
            "min_queue": round(min(queue_times), 2) if queue_times else 0,
            "under_50ms_percent": round(under_50 / len(queue_times) * 100, 1) if queue_times else 0
        }
    
    def _estimate_cost(self, model: str, daily_requests: int, avg_tokens: int) -> Dict:
        """ประมาณค่าใช้จ่าย"""
        prices = {
            "gpt-4o": 8.00,
            "gpt-4o-mini": 0.75,
            "claude-sonnet-4.5": 15.00,
            "gemini-2.5-flash": 2.50,
            "deepseek-v3.2": 0.42
        }
        
        price_per_mtok = prices.get(model, 8.00)
        monthly_requests = daily_requests * 30
        tokens_per_month = monthly_requests * avg_tokens / 1_000_000
        
        return {
            "daily": round(daily_requests * avg_tokens / 1_000_000 * price_per_mtok, 2),
            "monthly": round(tokens_per_month * price_per_mtok, 2),
            "yearly": round(tokens_per_month * price_per_mtok * 12, 2),
            "price_per_mtok": price_per_mtok
        }
    
    def _calculate_score(self, load: Dict, queue: Dict) -> int:
        """คำนวณคะแนนรวม"""
        score = 100
        
        # หักคะแนนจาก latency
        if load['p95_latency'] > 2000:
            score -= 20
        elif load['p95_latency'] > 1000:
            score -= 10
        
        # หักคะแนนจาก queue
        if queue['avg_queue'] > 200:
            score -= 30
        elif queue['avg_queue'] > 100:
            score -= 15
        
        # หักคะแนนจาก success rate
        if load['success_rate'] < 95:
            score -= 20
        
        return max(0, score)
    
    def _get_recommendation(self, score: int) -> str:
        """แนะนำตามคะแนน"""
        if score >= 90:
            return "✅ ระบบทำงานได้ดีเยี่ยม"
        elif score >= 70:
            return "🟡 ระบบทำงานได้ดี สามารถปรับปรุงได้"
        elif score >= 50:
            return "🟠 ควรพิจารณาปรับปรุงระบบ"
        else:
            return "🔴 ต้องแก้ไขปัญหาเร่งด่วน"

ใช้งาน

dashboard = LLMInferenceDashboard(api_key="YOUR_HOLYSHEEP_API_KEY") report = dashboard.run_full_diagnostic(model="gpt-4o", duration=60)

Save report

with open("inference_report.json", "w") as f: json.dump(report, f, indent=2)

ข้อผิดพลาดที่พบบ่อยและวิธีแก้ไข

กรณีที่ 1: 403 Forbidden Error

สาเหตุ: API Key ไม่ถูกต้องหรือหมดอายุ หรือ base_url ผิด

# ❌ วิธีผิด - ใช้ base_url ของ OpenAI
response = requests.post(
    "https://api.openai.com/v1/chat/completions",  # ผิด!
    headers={"Authorization": f"Bearer {api_key}"},
    ...
)

✅ วิธีถูก - ใช้ HolySheep API

response = requests.post( "https://api.holysheep.ai/v1/chat/completions", # ถูกต้อง headers={ "Authorization": f"Bearer YOUR_HOLYSHEEP_API_KEY", "Content-Type": "application/json" }, json={ "model": "gpt-4o", "messages": [{"role": "user", "content": "Hello"}] } )

ตรวจสอบ error

if response.status_code == 403: print(f"Error: {response.json()}") # {"error": {"message": "Invalid API key"}} # วิธีแก้: ไปที่ https://www.holysheep.ai/register เพื่อสร้าง key ใหม่

กรึ่งที่ 2: Timeout บ่อยครั้ง

สาเหตุ: Request timeout ตั้งสั้นเกินไป หรือ GPU queue เต็ม

# ❌ วิธีผิด - timeout 30 วินาที อาจไม่พอ
response = requests.post(
    url,
    headers=headers,
    json=payload,
    timeout=30  # สั้นเกินไป
)

✅ วิธีถูก - timeout 120 วินาที + retry logic

from requests.adapters import HTTPAdapter from requests.packages.urllib3.util.retry import Retry def create_session_with_retry(): session = requests.Session() retry = Retry( total=3, backoff_factor=1, status_forcelist=[408, 429, 500, 502, 503, 504], ) adapter = HTTPAdapter(max_retries=retry) session.mount('https://', adapter) return session session = create_session_with_retry() try: response = session.post( "https://api.holysheep.ai/v1/chat/completions", headers={ "Authorization": "Bearer YOUR_HOLYSHEEP_API_KEY", "Content-Type": "application/json" }, json={ "model": "gpt-4o", "messages": [{"role": "user", "content": "Explain AI"}], "max_tokens": 500 }, timeout=120 # เพิ่มเป็น 120 วินาที ) response.raise_for_status() except requests.exceptions.Timeout: print("Request timeout - GPU queue may be full, consider reducing load") except requests.exceptions.RequestException as e: print(f"Request failed: {e}")

กรณีที่ 3: Rate Limit 429

สาเหตุ: เรียก API บ่อยเกินไปเกิน rate limit

# ❌ วิธีผิด - ส่ง request พร้อมกันทั้งหมดโดยไม่มี rate limiting
for i in range(1000):
    send_request(i)  # จะโดน