Best use case
Model Fine-Tuning is best used when you need a repeatable AI agent workflow instead of a one-off prompt.
## Metadata
Teams using Model Fine-Tuning should expect a more consistent output, faster repeated execution, less prompt rewriting.
When to use this skill
- You want a reusable workflow that can be run more than once with consistent structure.
When not to use this skill
- You only need a quick one-off answer and do not need a reusable workflow.
- You cannot install or maintain the underlying files, dependencies, or repository context.
Installation
Claude Code / Cursor / Codex
$curl -o ~/.claude/skills/fine-tuning/SKILL.md --create-dirs "https://raw.githubusercontent.com/0gfoundation/0g-agent-skills/main/skills/compute/fine-tuning/SKILL.md"
Manual Installation
- Download SKILL.md from GitHub
- Place it in
.claude/skills/fine-tuning/SKILL.mdinside your project - Restart your AI agent — it will auto-discover the skill
How Model Fine-Tuning Compares
| Feature / Agent | Model Fine-Tuning | Standard Approach |
|---|---|---|
| Platform Support | Not specified | Limited / Varies |
| Context Awareness | High | Baseline |
| Installation Complexity | Unknown | N/A |
Frequently Asked Questions
What does this skill do?
## Metadata
Where can I find the source code?
You can find the source code on GitHub using the link provided at the top of the page.
SKILL.md Source
# Model Fine-Tuning
## Metadata
- **Category**: compute
- **SDK**: `@0glabs/0g-serving-broker` ^0.6.5 (CLI-based workflow)
- **Activation Triggers**: "fine-tune", "train model", "custom model", "model training"
## Purpose
Fine-tune AI models on 0G's distributed GPU network. Upload training data, configure parameters,
monitor training, and download the resulting model. **Currently testnet only.**
## Prerequisites
- Node.js >= 22
- `@0glabs/0g-serving-broker` CLI installed globally
- Testnet wallet with 0G tokens
- Training dataset in required format
- Configuration file for training parameters
## Quick Workflow
1. List available providers and models
2. Prepare dataset and configuration
3. Upload dataset to 0G Storage
4. Calculate dataset size for cost estimation
5. Transfer funds to provider
6. Create fine-tuning task
7. Monitor progress
8. Download and decrypt model when complete
## Core Rules
### ALWAYS
- Use testnet (fine-tuning not yet on mainnet)
- Verify provider availability before uploading data
- Save the root hash from dataset upload
- Save the task ID from task creation
- Wait for `Delivered` status before downloading
- Wait for `Finished` status before decrypting
- Acknowledge provider before first use
- Use correct `processResponse()` param order: `(providerAddress, chatID, usageData)`
- Extract ChatID from `ZG-Res-Key` header first, body as fallback (chatbot only)
### NEVER
- Create a new task while previous task is running
- Initiate refund during active fine-tuning
- Forget to decrypt the downloaded model
- Use mainnet for fine-tuning (not yet supported)
- Hardcode private keys
- Use ethers v5 syntax
## Task Status Lifecycle
```
Init -> SettingUp -> SetUp -> Training -> Trained -> Delivering -> Delivered -> UserAcknowledged -> Finished
|
Failed
```
| Status | Description | Action |
| ------------------ | ------------------ | -------------- |
| `Init` | Task submitted | Wait |
| `SettingUp` | Provider preparing | Wait |
| `Training` | Model training | Monitor logs |
| `Delivered` | Result uploaded | Download model |
| `UserAcknowledged` | Download confirmed | Wait for key |
| `Finished` | Complete | Decrypt model |
| `Failed` | Task failed | Check logs |
## Complete Workflow (CLI)
### 1. Find Provider
```bash
0g-compute-cli fine-tuning list-providers
# Official testnet provider: 0xf07240Efa67755B5311bc75784a061eDB47165Dd
```
### 2. List Available Models
```bash
0g-compute-cli fine-tuning list-models
# Available: distilbert-base-uncased (Text Classification)
```
### 3. Upload Dataset
```bash
0g-compute-cli fine-tuning upload --data-path ./my_dataset.json
# Output: Root hash: 0xabc123...
```
### 4. Calculate Size
```bash
0g-compute-cli fine-tuning calculate-token \
--model distilbert-base-uncased \
--dataset-path ./my_dataset.json \
--provider 0xf07240Efa67755B5311bc75784a061eDB47165Dd
```
### 5. Fund Provider
```bash
0g-compute-cli transfer-fund \
--provider 0xf07240Efa67755B5311bc75784a061eDB47165Dd \
--amount 1
```
### 6. Create Task
```bash
0g-compute-cli fine-tuning create-task \
--provider 0xf07240Efa67755B5311bc75784a061eDB47165Dd \
--model distilbert-base-uncased \
--dataset 0xabc123... \
--config-path ./config.json \
--data-size 1000000
# Output: Created Task ID: 6b607314-88b0-4fef-91e7-43227a54de57
```
### 7. Monitor Progress
```bash
0g-compute-cli fine-tuning get-task \
--provider 0xf07240Efa67755B5311bc75784a061eDB47165Dd \
--task 6b607314-88b0-4fef-91e7-43227a54de57
# View training logs
0g-compute-cli fine-tuning get-log \
--provider 0xf07240Efa67755B5311bc75784a061eDB47165Dd \
--task 6b607314-88b0-4fef-91e7-43227a54de57
```
### 8. Download Model (when status = Delivered)
```bash
0g-compute-cli fine-tuning acknowledge-model \
--provider 0xf07240Efa67755B5311bc75784a061eDB47165Dd \
--task-id 6b607314-88b0-4fef-91e7-43227a54de57 \
--data-path ./encrypted_model.bin
```
### 9. Decrypt Model (when status = Finished)
```bash
0g-compute-cli fine-tuning decrypt-model \
--provider 0xf07240Efa67755B5311bc75784a061eDB47165Dd \
--task-id 6b607314-88b0-4fef-91e7-43227a54de57 \
--encrypted-model ./encrypted_model.bin \
--output ./my_model.zip
unzip ./my_model.zip -d ./my_fine_tuned_model/
```
## SDK Integration
```typescript
import { ethers } from 'ethers';
import { createZGComputeNetworkBroker } from '@0glabs/0g-serving-broker';
import 'dotenv/config';
async function checkFineTuningAccount(providerAddress: string) {
const provider = new ethers.JsonRpcProvider(process.env.RPC_URL);
const wallet = new ethers.Wallet(process.env.PRIVATE_KEY!, provider);
const broker = await createZGComputeNetworkBroker(wallet);
// Transfer funds for fine-tuning
await broker.ledger.transferFund(providerAddress, 'fine-tuning', ethers.parseEther('1'));
// Check sub-account (returns [subAccountTuple, refundsArray])
const [account, refunds] = await broker.fineTuning.getAccountWithDetail(providerAddress);
// Tuple: [0]=user, [1]=provider, [2]=balance, ...
console.log(`Fine-tuning balance: ${ethers.formatEther(account[2])} 0G`);
}
```
### Error Handling
```typescript
async function monitorTask(providerAddress: string, taskId: string) {
const provider = new ethers.JsonRpcProvider(process.env.RPC_URL);
const wallet = new ethers.Wallet(process.env.PRIVATE_KEY!, provider);
const broker = await createZGComputeNetworkBroker(wallet);
const pollInterval = 30000; // 30 seconds
const maxAttempts = 120; // 1 hour max
for (let attempt = 0; attempt < maxAttempts; attempt++) {
try {
// Check task status via CLI or SDK
console.log(`Polling task ${taskId} (attempt ${attempt + 1})...`);
// In practice, use CLI: 0g-compute-cli fine-tuning get-task
// SDK integration for status checking may vary
await new Promise((resolve) => setTimeout(resolve, pollInterval));
} catch (error) {
console.error('Status check failed:', error);
if (attempt === maxAttempts - 1) throw error;
}
}
}
```
## Cost Estimation
- Price based on dataset size (bytes) x provider rate
- Typical rate: `0.000000000000000001 0G` per byte
- Calculate with `0g-compute-cli fine-tuning calculate-token`
- Always transfer 10-20% extra as buffer
## Anti-Patterns
```bash
# BAD: Creating task while another is running
0g-compute-cli fine-tuning create-task ... # Error: provider busy
# BAD: Downloading before Delivered status
0g-compute-cli fine-tuning acknowledge-model ... # Will fail
# BAD: Decrypting before Finished status
0g-compute-cli fine-tuning decrypt-model ... # Key not available yet
```
```typescript
// BAD: Hardcoding private keys
const wallet = new ethers.Wallet('0xabc123...', provider); // NEVER do this
// BAD: ethers v5 syntax
const provider = new ethers.providers.JsonRpcProvider(url); // v5!
```
## Common Errors & Fixes
| Error | Cause | Fix |
| --------------------------- | --------------------- | ------------------------------ |
| `Provider busy` | Previous task running | Wait or use different provider |
| `Insufficient balance` | Sub-account empty | Transfer more funds |
| `Dataset validation failed` | Wrong format | Check dataset structure |
| `Decryption failed` | Wrong status or key | Wait for `Finished` status |
| `Task failed` | Config or data issue | Check logs for details |
| `Provider not acknowledged` | First-time provider | `acknowledgeProviderSigner()` |
## Related Skills
- [Provider Discovery](../provider-discovery/SKILL.md) — find fine-tuning providers
- [Account Management](../account-management/SKILL.md) — fund fine-tuning account
## References
- [Compute Patterns](../../../patterns/COMPUTE.md)
- [Network Config](../../../patterns/NETWORK_CONFIG.md)
- [0G Serving Broker Releases](https://github.com/0gfoundation/0g-serving-broker/releases)Related Skills
We are still matching the closest adjacent skills for this page. In the meantime, continue through the full directory.