|
|
--- |
|
|
library_name: transformers |
|
|
tags: |
|
|
- unsloth |
|
|
- trl |
|
|
- sft |
|
|
--- |
|
|
## Model Details |
|
|
|
|
|
This model is finetuned on mutiple datasets related to ABC notation (mostly Irish data) |
|
|
|
|
|
|
|
|
|
|
|
## CLI demo for 4-bit quantize |
|
|
```python |
|
|
from transformers import AutoTokenizer, AutoModelForCausalLM, GenerationConfig, BitsAndBytesConfig |
|
|
import torch |
|
|
import torchaudio |
|
|
import re |
|
|
|
|
|
quantization_config = BitsAndBytesConfig( |
|
|
load_in_4bit=True, |
|
|
bnb_4bit_compute_dtype=torch.float16, |
|
|
bnb_4bit_use_double_quant=True, |
|
|
bnb_4bit_quant_type="nf4" |
|
|
) |
|
|
|
|
|
# Alpaca prompt template |
|
|
alpaca_prompt = """Below is an instruction that describes a task, paired with an input that provides further context. Write a response that appropriately completes the request. |
|
|
### Instruction: |
|
|
{} |
|
|
### Input: |
|
|
{} |
|
|
### Response: |
|
|
{}""" |
|
|
|
|
|
|
|
|
tokenizer = AutoTokenizer.from_pretrained("Seeker38/gemma-2-9b-it-abc-notation") |
|
|
|
|
|
# model 4-bit quant |
|
|
model = AutoModelForCausalLM.from_pretrained( |
|
|
"Seeker38/gemma-2-9b-it-abc-notation", |
|
|
quantization_config=quantization_config, |
|
|
device_map="auto", |
|
|
resume_download=True |
|
|
).eval() |
|
|
|
|
|
|
|
|
generation_config = GenerationConfig( |
|
|
temperature=0.2, |
|
|
top_k=40, |
|
|
top_p=0.9, |
|
|
do_sample=True, |
|
|
num_beams=1, |
|
|
repetition_penalty=1.1, |
|
|
min_new_tokens=10, |
|
|
max_new_tokens=1536 |
|
|
) |
|
|
|
|
|
instruction = """Create a musical composition using the given motif and adhering to the specified musical form represented by alphabet characters. |
|
|
X:1 |
|
|
L:1/8 |
|
|
Q:3/8=90 |
|
|
M:6/8 |
|
|
K:A |
|
|
['e cAA ABc dBB Tf2 e fdd', 'e fga']""" |
|
|
# input_context = "'A', 'D', 'E7', 'A', 'E/G#', 'A', 'Bm', 'A7/C#', 'D', 'E7', 'A', 'A', 'D', 'A', 'A', 'D', 'A', 'A', 'D', 'A', 'D', 'A/D#', 'E', 'A', 'D', 'A', 'A', 'D', 'A', 'E7'" |
|
|
input_context = "" |
|
|
|
|
|
prompt = alpaca_prompt.format( |
|
|
instruction, # instruction |
|
|
input_context, # input |
|
|
"", # output - leave this blank for generation! |
|
|
) |
|
|
|
|
|
# Tokenize input |
|
|
inputs = tokenizer([prompt], return_tensors="pt").to("cuda") |
|
|
|
|
|
# Generate response with specified parameters |
|
|
with torch.no_grad(): |
|
|
outputs = model.generate( |
|
|
**inputs, |
|
|
max_new_tokens=2048, |
|
|
temperature=0.2, |
|
|
top_p=0.9, |
|
|
top_k=40, |
|
|
use_cache=True, |
|
|
do_sample=True, |
|
|
repetition_penalty=1.1, |
|
|
pad_token_id=tokenizer.eos_token_id |
|
|
) |
|
|
|
|
|
result = tokenizer.batch_decode(outputs, skip_special_tokens=True) |
|
|
print("Generated Response:") |
|
|
print(result[0]) |
|
|
|
|
|
# to render abc notation, you need to install symusic |
|
|
# pip install symusic |
|
|
import re |
|
|
from symusic import Score, Synthesizer |
|
|
|
|
|
abc_notation = re.search(r'### Response:\s*(.*)', result[0], re.DOTALL).group(1).strip() |
|
|
|
|
|
s = Score.from_abc(abc_notation) |
|
|
audio = Synthesizer().render(s, stereo=True) |
|
|
torchaudio.save('cm_music_piece.wav', torch.FloatTensor(audio), 44100) |
|
|
|
|
|
from IPython.display import Audio, display |
|
|
|
|
|
from pydub import AudioSegment |
|
|
wav_link = "cm_music_piece.wav" |
|
|
mp3_file = AudioSegment.from_wav(wav_link).export("cm_music_piece.mp3", format="mp3") |
|
|
|
|
|
display(Audio(wav_link)) |
|
|
display(Audio('cm_music_piece.mp3')) |
|
|
``` |
|
|
|
|
|
|
|
|
## Example Stable Prompts |
|
|
Here some prompts that are tested to be stable. The convert code and prompt is from 🤗 [ChatMusician](https://huggingface.co/m-a-p/ChatMusician). |
|
|
|
|
|
### Function: Chord Conditioned Music Generation |
|
|
``` |
|
|
Develop a musical piece using the given chord progression. |
|
|
'Dm', 'C', 'Dm', 'Dm', 'C', 'Dm', 'C', 'Dm' |
|
|
``` |
|
|
|
|
|
### Function: Text2music |
|
|
``` |
|
|
Develop a tune influenced by Bach's compositions. |
|
|
``` |
|
|
``` |
|
|
Using ABC notation, recreate the given text as a musical score. |
|
|
Meter C |
|
|
Notes The parts are commonly interchanged. |
|
|
Transcription 1997 by John Chambers |
|
|
Key D |
|
|
Note Length 1/8 |
|
|
Rhythm reel |
|
|
``` |
|
|
|
|
|
### Function: Melody Harmonization |
|
|
|
|
|
``` |
|
|
Construct smooth-flowing chord progressions for the supplied music. |
|
|
|
|
|
|: BA | G2 g2"^(C)" edeg | B2 BA"^(D7)" BcBA | G2 g2 edeg | dBAG A2 BA | |
|
|
G2 g2"^(C)" edeg | B2 BA B2 d2 | e2 ef e2 (3def | gedB A2 :: BA | G2 BG dGBe | |
|
|
dBBA"^(D7)" B3 A | G2 BG dGBe | dBAG A4 | G2 BG dGBe | dBBA B3 d | |
|
|
e2 ef e2 (3def | gedB A2 :| |
|
|
``` |
|
|
``` |
|
|
Develop a series of chord pairings that amplify the harmonious elements in the given music piece. |
|
|
|
|
|
E |: EAA ABc | Bee e2 d | cBA ABc | BEE E2 D | EAA ABc | Bee e2 d | |
|
|
cBA ^GAB |1 A2 A A2 E :|2 A2 A GAB || c3 cdc | Bgg g2 ^g | aed cBA | |
|
|
^GAB E^F^G | A^GA BAB | cde fed | cBA ^GAB |1 A2 A GAB :|2 \n A3 A2 || |
|
|
``` |
|
|
|
|
|
### Function: Musical Form Conditioned Music Generation |
|
|
|
|
|
``` |
|
|
Develop a composition by incorporating elements from the given melodic structure. |
|
|
|
|
|
Ternary, Sectional: Verse/Chorus/Bridge |
|
|
``` |
|
|
|
|
|
### Function: Motif and Form Conditioned Music Generation |
|
|
|
|
|
``` |
|
|
Create music by following the alphabetic representation of the assigned musical structure and the given motif. |
|
|
|
|
|
Musical Form Input: AB |
|
|
|
|
|
ABC Notation Music Input: |
|
|
X:1 |
|
|
L:1/8 |
|
|
M:2/4 |
|
|
K:D |
|
|
['d>ef>d g>ef>c d>ef>d c2 e2 d>ef>d g>ef>d', '(3(Ace) (3(Ace)'] |
|
|
``` |
|
|
|
|
|
|
|
|
|
|
|
|