|
--- |
|
license: llama2 |
|
datasets: |
|
- AlfredPros/smart-contracts-instructions |
|
language: |
|
- en |
|
tags: |
|
- code |
|
- blockchain |
|
- solidity |
|
- smart contract |
|
--- |
|
# Code LLaMA 7B Instruct Solidity |
|
|
|
A finetuned 7 billion parameters Code LLaMA - Instruct model to generate Solidity smart contract using 4-bit QLoRA finetuning provided by PEFT library. |
|
|
|
# Training Dataset |
|
|
|
Dataset used to finetune the model is AlfredPros' Smart Contracts Instructions (https://huggingface.co/datasets/AlfredPros/smart-contracts-instructions). |
|
A dataset containing 6,003 GPT-generated human instruction and Solidity source code data pairs. This dataset has been processed for training LLMs. |
|
|
|
# Training Parameters |
|
|
|
## Bitsandbytes quantization configurations |
|
- Load in 4-bit: true |
|
- 4-bit quantization type: NF4 |
|
- 4-bit compute dtype: float16 |
|
- 4-bit use double quantization: true |
|
|
|
## Supervised finetuning trainer parameters |
|
- Number of train epochs: 1 |
|
- FP16: true |
|
- FP16 option level: O1 |
|
- BF16: false |
|
- Per device train batch size: 1 |
|
- Gradient accumulation steps: 1 |
|
- Gradient checkpointing: true |
|
- Max gradient normal: 0.3 |
|
- Learning rate: 2e-4 |
|
- Weight decay: 0.001 |
|
- Optimizer: paged AdamW 32-bit |
|
- Learning rate scheduler type: cosine |
|
- Warmup ratio: 0.03 |
|
|
|
# Training Details |
|
- GPU used: 1x NVIDIA GeForce GTX 1080Ti |
|
- Training time: 21 hours, 4 minutes, and 57 seconds |
|
|
|
# Training Loss |
|
``` |
|
Step Training Loss |
|
100 0.330900 |
|
200 0.293000 |
|
300 0.276500 |
|
400 0.290900 |
|
500 0.306100 |
|
600 0.302600 |
|
700 0.337200 |
|
800 0.295000 |
|
900 0.297800 |
|
1000 0.299500 |
|
1100 0.268900 |
|
1200 0.257800 |
|
1300 0.264100 |
|
1400 0.294400 |
|
1500 0.293900 |
|
1600 0.287600 |
|
1700 0.281200 |
|
1800 0.273400 |
|
1900 0.266600 |
|
2000 0.227500 |
|
2100 0.261600 |
|
2200 0.275700 |
|
2300 0.290100 |
|
2400 0.290900 |
|
2500 0.316200 |
|
2600 0.296500 |
|
2700 0.291400 |
|
2800 0.253300 |
|
2900 0.321500 |
|
3000 0.269500 |
|
3100 0.295600 |
|
3200 0.265800 |
|
3300 0.262800 |
|
3400 0.274900 |
|
3500 0.259800 |
|
3600 0.226300 |
|
3700 0.325700 |
|
3800 0.249000 |
|
3900 0.237200 |
|
4000 0.251400 |
|
4100 0.247000 |
|
4200 0.278700 |
|
4300 0.264000 |
|
4400 0.245000 |
|
4500 0.235900 |
|
4600 0.240400 |
|
4700 0.235200 |
|
4800 0.220300 |
|
4900 0.202700 |
|
5000 0.240500 |
|
5100 0.258500 |
|
5200 0.236300 |
|
5300 0.267500 |
|
5400 0.236700 |
|
5500 0.265900 |
|
5600 0.244900 |
|
5700 0.297900 |
|
5800 0.281200 |
|
5900 0.313800 |
|
6000 0.249800 |
|
6003 0.271939 |
|
``` |
|
|
|
# Example Usage |
|
```py |
|
from transformers import BitsAndBytesConfig, AutoTokenizer, AutoModelForCausalLM |
|
import torch |
|
import accelerate |
|
|
|
use_4bit = True |
|
bnb_4bit_compute_dtype = "float16" |
|
bnb_4bit_quant_type = "nf4" |
|
use_double_nested_quant = True |
|
compute_dtype = getattr(torch, bnb_4bit_compute_dtype) |
|
|
|
# BitsAndBytesConfig 4-bit config |
|
bnb_config = BitsAndBytesConfig( |
|
load_in_4bit=use_4bit, |
|
bnb_4bit_use_double_quant=use_double_nested_quant, |
|
bnb_4bit_quant_type=bnb_4bit_quant_type, |
|
bnb_4bit_compute_dtype=compute_dtype, |
|
load_in_8bit_fp32_cpu_offload=True |
|
) |
|
|
|
# Load model in 4-bit |
|
tokenizer = AutoTokenizer.from_pretrained("AlfredPros/CodeLlama-7b-Instruct-Solidity") |
|
model = AutoModelForCausalLM.from_pretrained("AlfredPros/CodeLlama-7b-Instruct-Solidity", quantization_config=bnb_config, device_map="balanced_low_0") |
|
|
|
# Make input |
|
input='Make a smart contract to create a whitelist of approved wallets. The purpose of this contract is to allow the DAO (Decentralized Autonomous Organization) to approve or revoke certain wallets, and also set a checker address for additional validation if needed. The current owner address can be changed by the current owner.' |
|
|
|
# Make prompt template |
|
prompt = f"""### Instruction: |
|
Use the Task below and the Input given to write the Response, which is a programming code that can solve the following Task: |
|
|
|
### Task: |
|
{input} |
|
|
|
### Solution: |
|
""" |
|
|
|
# Tokenize the input |
|
input_ids = tokenizer(prompt, return_tensors="pt", truncation=True).input_ids.cuda() |
|
# Run the model to infere an output |
|
outputs = model.generate(input_ids=input_ids, max_new_tokens=1024, do_sample=True, top_p=0.9, temperature=0.001, pad_token_id=1) |
|
|
|
# Detokenize and display the generated output |
|
print(tokenizer.batch_decode(outputs.detach().cpu().numpy(), skip_special_tokens=True)[0][len(prompt):]) |
|
``` |