| | --- |
| | 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):]) |
| | ``` |