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
- List available providers and models
- Prepare dataset and configuration
- Upload dataset to 0G Storage
- Calculate dataset size for cost estimation
- Transfer funds to provider
- Create fine-tuning task
- Monitor progress
- 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
0g-compute-cli fine-tuning list-providers
# Official testnet provider: 0xf07240Efa67755B5311bc75784a061eDB47165Dd
2. List Available Models
0g-compute-cli fine-tuning list-models
# Available: distilbert-base-uncased (Text Classification)
3. Upload Dataset
0g-compute-cli fine-tuning upload --data-path ./my_dataset.json
# Output: Root hash: 0xabc123...
4. Calculate Size
0g-compute-cli fine-tuning calculate-token \
--model distilbert-base-uncased \
--dataset-path ./my_dataset.json \
--provider 0xf07240Efa67755B5311bc75784a061eDB47165Dd
5. Fund Provider
0g-compute-cli transfer-fund \
--provider 0xf07240Efa67755B5311bc75784a061eDB47165Dd \
--amount 1
6. Create Task
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
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)
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)
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
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
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
# 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
// 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 — find fine-tuning providers
- Account Management — fund fine-tuning account
References