Skip to main content

pyre-code-ml-practice

Self-hosted ML coding practice platform with 68 problems covering Transformers, diffusion, RLHF, and more — instant browser feedback, no GPU required.

소스 정보

저장소
reason-machines/trending-skills
최근 소스 활동
2026년 4월 11일 00:41
감지된 SKILL.md 언어
영어
스타
84
포크
15

설치 방법

기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.

소스 파일 검토

설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.

SKILL.md 표시 중

SKILL.md
소스 지침 · 읽기 전용 미리보기
name
pyre-code-ml-practice
description
Self-hosted ML coding practice platform with 68 problems covering Transformers, diffusion, RLHF, and more — instant browser feedback, no GPU required.
triggers
["set up pyre code practice platform","add a new ml coding problem to pyre","how do I run the grading service","configure AI help for pyre code","pyre code problem set and learning paths","implement a coding challenge in pyre","troubleshoot pyre code submission grading","deploy pyre code with docker"]
# Pyre Code ML Practice Platform > Skill by [ara.so](https://ara.so) — Daily 2026 Skills collection. Pyre Code is a self-hosted ML coding practice platform with 68 problems ranging from ReLU to flow matching. Users implement internals of modern AI systems (Transformers, vLLM, TRL, diffusion models) in a browser editor with instant pass/fail feedback, no GPU required. --- ## Installation ### Option A — One-liner (recommended) ```bash git clone https://github.com/whwangovo/pyre-code.git cd pyre-code ./setup.sh npm run dev ``` `setup.sh` creates a `.venv` (prefers `uv`, falls back to `python3 -m venv`), installs all Python deps, then prints the start command. ### Option B — Conda ```bash git clone https://github.com/whwangovo/pyre-code.git cd pyre-code conda create -n pyre python=3.11 -y && conda activate pyre pip install -e ".[dev]" npm install npm run dev ``` ### Option C — Docker ```bash git clone https://github.com/whwangovo/pyre-code.git cd pyre-code docker compose up --build ``` Progress persists in a Docker volume. Reset with `docker compose down -v`. ### After installation - **Grading service**: `http://localhost:8000` - **Web app**: `http://localhost:3000` --- ## Project Structure ``` pyre/ ├── web/ # Next.js frontend │ ├── src/app/ # Pages and API routes │ ├── src/components/ # UI components │ └── src/lib/ # Utilities, problem data ├── grading_service/ # FastAPI backend (grading API) ├── torch_judge/ # Judge engine — problem definitions + test runner │ ├── problems/ # Individual problem modules │ └── runner.py # Test execution logic ├── setup.sh # Environment bootstrap script ├── package.json # Dev scripts (runs frontend + backend concurrently) └── pyproject.toml # Python package config ``` --- ## Key Commands ```bash # Start both frontend and backend concurrently npm run dev # Start only the grading service (FastAPI) cd grading_service && uvicorn main:app --reload --port 8000 # Start only the frontend (Next.js) cd web && npm run dev # Run Python tests pytest torch_judge/ # Install Python package in editable mode with dev deps pip install -e ".[dev]" # Docker: build and start docker compose up --build # Docker: stop and remove volumes (reset progress) docker compose down -v ``` --- ## Configuration ### Environment Variables Create `web/.env.local` to override defaults: ```bash # URL of the FastAPI grading service GRADING_SERVICE_URL=http://localhost:8000 # SQLite database path for progress tracking DB_PATH=./data/pyre.db ``` ### AI Help (Optional) Copy `web/.env.example` to `web/.env` and configure: ```bash AI_HELP_BASE_URL=https://api.openai.com/v1 AI_HELP_API_KEY=$OPENAI_API_KEY AI_HELP_MODEL=gpt-4o-mini ``` Any OpenAI-compatible endpoint works: OpenAI, Anthropic via proxy, Ollama, etc. Users can also set their own key in the UI if no server-side config is present. --- ## Problem Categories | Category | Examples | |---|---| | **Fundamentals** | ReLU, Softmax, GELU, SwiGLU, Dropout, Embedding, Linear, Kaiming Init | | **Normalization** | LayerNorm, BatchNorm, RMSNorm | | **Attention** | Scaled Dot-Product, Multi-Head, Causal, GQA, Flash, Differential, MLA | | **Position Encoding** | Sinusoidal PE, RoPE, ALiBi, NTK-aware RoPE | | **Architecture** | GPT-2 Block, ViT Block, Conv2D, MoE, Depthwise Conv | | **Training** | Adam, Cosine LR, Gradient Clipping, Mixed Precision, Activation Checkpointing | | **Distributed** | Tensor Parallel, FSDP, Ring Attention | | **Inference** | KV Cache, Top-k Sampling, Beam Search, Speculative Decoding, Paged Attention | | **Alignment** | DPO, GRPO, PPO, Reward Model | | **Diffusion** | Noise Schedule, DDIM Step, Flow Matching, adaLN-Zero | | **Adaptation** | LoRA, QLoRA | | **Reasoning** | MCTS, Multi-Token Prediction | | **SSM** | Mamba SSM | --- ## Adding a New Problem Problems live in `torch_judge/problems/`. Each problem is a Python module with a standard structure: ```python # torch_judge/problems/my_new_problem.py import torch import torch.nn as nn from typing import Any PROBLEM_ID = "my_new_problem" TITLE = "My New Problem: Implement Foo" DIFFICULTY = "medium" # "easy" | "medium" | "hard" CATEGORY = "Fundamentals" DESCRIPTION = """ ## My New Problem Implement the `foo` function that does XYZ. ### Input - `x` (Tensor): shape `(batch, dim)` ### Output - Tensor of shape `(batch, dim)` ### Formula $$\\text{foo}(x) = x^2 + 1$$ """ STARTER_CODE = """ import torch def foo(x: torch.Tensor) -> torch.Tensor: # Your implementation here pass """ REFERENCE_SOLUTION = """ import torch def foo(x: torch.Tensor) -> torch.Tensor: return x ** 2 + 1 """ def make_test_cases() -> list[dict[str, Any]]: \"\"\"Return a list of test cases, each with inputs and expected outputs.\"\"\" cases = [] # Basic case x = torch.tensor([[1.0, 2.0, 3.0]]) cases.append({ "input": {"x": x}, "expected": x ** 2 + 1, "description": "Basic 1x3 tensor", }) # Batch case x = torch.randn(4, 16) cases.append({ "input": {"x": x}, "expected": x ** 2 + 1, "description": "Batch of 4, dim 16", }) # Edge case: zeros x = torch.zeros(2, 8) cases.append({ "input": {"x": x}, "expected": torch.ones(2, 8), "description": "Zero tensor", }) return cases def grade(submission_code: str) -> dict[str, Any]: \"\"\"Execute submission and return grading results.\"\"\" namespace = {} exec(submission_code, namespace) if "foo" not in namespace: return {"passed": 0, "total": 0, "error": "Function 'foo' not found"} fn = namespace["foo"] test_cases = make_test_cases() results = [] for i, case in enumerate(test_cases): try: output = fn(**case["input"]) passed = torch.allclose(output, case["expected"], atol=1e-5) results.append({ "case": i + 1, "description": case["description"], "passed": passed, "error": None if passed else f"Output mismatch: got {output}, expected {case['expected']}", }) except Exception as e: results.append({ "case": i + 1, "description": case["description"], "passed": False, "error": str(e), }) passed = sum(r["passed"] for r in results) return { "passed": passed, "total": len(results), "results": results, } ``` ### Register the problem After creating the module, register it in the problem registry (typically `torch_judge/registry.py` or equivalent): ```python from torch_judge.problems import my_new_problem PROBLEMS = [ # ... existing problems ... my_new_problem, ] ``` --- ## Grading Service API The FastAPI grading service at `http://localhost:8000` exposes: ```bash # Health check GET /health # List all problems GET /problems # Get a specific problem GET /problems/{problem_id} # Submit a solution POST /submit Content-Type: application/json { "problem_id": "relu", "code": "import torch\n\ndef relu(x):\n return torch.clamp(x, min=0)" } # Response { "problem_id": "relu", "passed": 3, "total": 3, "results": [ {"case": 1, "description": "Basic positive values", "passed": true, "error": null}, {"case": 2, "description": "Negative values", "passed": true, "error": null}, {"case": 3, "description": "Mixed values", "passed": true, "error": null} ] } ``` ### Calling the grading API from Python ```python import requests response = requests.post( "http://localhost:8000/submit", json={ "problem_id": "softmax", "code": """ import torch def softmax(x: torch.Tensor, dim: int = -1) -> torch.Tensor: x_max = x.max(dim=dim, keepdim=True).values x_exp = torch.exp(x - x_max) return x_exp / x_exp.sum(dim=dim, keepdim=True) """ } ) result = response.json() print(f"Passed {result['passed']}/{result['total']} test cases") for r in result["results"]: status = "✓" if r["passed"] else "✗" print(f" {status} Case {r['case']}: {r['description']}") if r["error"]: print(f" Error: {r['error']}") ``` --- ## Example Implementations ### Scaled Dot-Product Attention ```python import torch import torch.nn.functional as F import math def scaled_dot_product_attention( q: torch.Tensor, # (batch, heads, seq, d_k) k: torch.Tensor, v: torch.Tensor, mask: torch.Tensor | None = None, ) -> torch.Tensor: d_k = q.size(-1) scores = torch.matmul(q, k.transpose(-2, -1)) / math.sqrt(d_k) if mask is not None: scores = scores.masked_fill(mask == 0, float('-inf')) weights = F.softmax(scores, dim=-1) return torch.matmul(weights, v) ``` ### RMSNorm ```python import torch def rms_norm(x: torch.Tensor, weight: torch.Tensor, eps: float = 1e-6) -> torch.Tensor: rms = x.pow(2).mean(dim=-1, keepdim=True).add(eps).sqrt() return x / rms * weight ``` ### LoRA Linear Layer ```python import torch import torch.nn as nn class LoRALinear(nn.Module): def __init__(self, in_features: int, out_features: int, rank: int = 4, alpha: float = 1.0): super().__init__() self.weight = nn.Parameter(torch.randn(out_features, in_features) * 0.02) self.lora_A = nn.Parameter(torch.randn(rank, in_features) * 0.02) self.lora_B = nn.Parameter(torch.zeros(out_features, rank)) self.scale = alpha / rank def forward(self, x: torch.Tensor) -> torch.Tensor: base = x @ self.weight.T lora = x @ self.lora_A.T @ self.lora_B.T return base + self.scale * lora ``` ### Cosine Learning Rate Schedule ```python import math def cosine_lr(step: int, max_steps: int, lr_max: float, lr_min: float = 0.0) -> float: if step >= max_steps: return lr_min progress = step / max_steps return lr_min + 0.5 * (lr_max - lr_min) * (1 + math.cos(math.pi * progress)) ``` ### KV Cache (Inference) ```python import torch from dataclasses import dataclass, field @dataclass class KVCache: keys: list[torch.Tensor] = field(default_factory=list)
GitHub에서 보기
이 SKILL.md는 매우 커서 SkillsMP가 여기에는 첫 섹션만 미리 보여줍니다. GitHub에서 보기