| { |
| "template_name": "stack-2.9-vastai", |
| "description": "Stack 2.9 LLM Inference Server for Vast.ai", |
| "created_at": "2025-06-18", |
| "docker_image": "your-registry/stack-2.9:latest", |
| "docker_tag": "latest", |
| "instance_type": "recommended", |
|
|
| "instance": { |
| "gpu_type": "RTX_4090", |
| "min_gpu_mem_gb": 24, |
| "min_disk_space_gb": 50, |
| "min_ram_gb": 16, |
| "min_vcpu_count": 4, |
| "max_price_usd_per_hour": 0.50, |
| "min_duration_seconds": 3600, |
| "max_duration_seconds": 86400 |
| }, |
|
|
| "environment": { |
| "MODEL_ID": "TheBloke/Llama-2-7B-Chat-AWQ", |
| "QUANTIZATION": "awq", |
| "TENSOR_PARALLEL_SIZE": "1", |
| "GPU_MEMORY_UTILIZATION": "0.9", |
| "MAX_MODEL_LEN": "4096", |
| "MAX_NUM_SEQS": "64", |
| "PORT": "8000", |
| "HOST": "0.0.0.0" |
| }, |
|
|
| "ssh": { |
| "enabled": true, |
| "port": 22, |
| "username": "root" |
| }, |
|
|
| "ports": [ |
| { |
| "host_port": 8000, |
| "container_port": 8000, |
| "protocol": "tcp" |
| }, |
| { |
| "host_port": 2222, |
| "container_port": 22, |
| "protocol": "tcp", |
| "purpose": "ssh" |
| } |
| ], |
|
|
| "startup_script": "#!/bin/bash\nset -e\n\n# Wait for NVIDIA drivers\necho 'Waiting for NVIDIA drivers...'\nwhile ! nvidia-smi &> /dev/null; do\n sleep 2\ndone\necho 'NVIDIA drivers detected'\n\n# Initialize model cache directory\nmkdir -p /home/vllm/.cache/huggingface\nchmod 755 /home/vllm/.cache/huggingface\n\n# Check if Hugging Face token is provided\nif [ -n \"$HUGGING_FACE_TOKEN\" ]; then\n echo \"Logging in to Hugging Face...\"\n python3 -c \"from huggingface_hub import login; login(token='$HUGGING_FACE_TOKEN')\"\nfi\n\n# Pre-download model if MODEL_CACHE_DIR exists and is empty\nif [ -d \"/home/vllm/.cache/huggingface\" ] && [ -z \"$(ls -A /home/vllm/.cache/huggingface 2>/dev/null)\" ]; then\n echo \"Pre-downloading model: $MODEL_ID\"\n python3 -c \"\nfrom transformers import AutoModelForCausalLM, AutoTokenizer\nmodel_id = '$MODEL_ID'\nprint(f'Downloading {model_id}...')\ntry:\n tokenizer = AutoTokenizer.from_pretrained(model_id, trust_remote_code=True)\n print('Tokenizer downloaded')\nexcept Exception as e:\n print(f'Tokenizer error (continuing): {e}')\ntry:\n model = AutoModelForCausalLM.from_pretrained(model_id, device_map='auto', trust_remote_code=True)\n print('Model downloaded')\nexcept Exception as e:\n print(f'Model error (vLLM will handle): {e}')\n\"\nfi\n\n# Start the server\necho 'Starting Stack 2.9 server...'\nexec python3 /app/app.py", |
|
|
| "health_check": { |
| "type": "HTTP", |
| "endpoint": "/health", |
| "interval_seconds": 30, |
| "timeout_seconds": 10, |
| "max_failures": 3 |
| }, |
|
|
| "pricing": { |
| "bid_strategy": "spot", |
| "max_bid_multiplier": 1.2, |
| "min_bid_usd_per_hour": 0.0 |
| }, |
|
|
| "setup_commands": [ |
| "apt-get update && apt-get install -y python3 python3-pip git curl wget libgomp1" |
| ], |
|
|
| "notes": [ |
| "Based on NVIDIA CUDA 12.1 runtime", |
| "Model cache is persisted to /home/vllm/.cache/huggingface", |
| "Uses vLLM for high-performance inference", |
| "OpenAI-compatible API endpoints", |
| "SSH available on port 2222 with forwarded port" |
| ] |
| } |
|
|