MRasheq commited on
Commit
c643b82
·
0 Parent(s):

First push

Browse files
Files changed (4) hide show
  1. .gitattributes +35 -0
  2. README.md +13 -0
  3. app.py +229 -0
  4. requirements.txt +1 -0
.gitattributes ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ *.7z filter=lfs diff=lfs merge=lfs -text
2
+ *.arrow filter=lfs diff=lfs merge=lfs -text
3
+ *.bin filter=lfs diff=lfs merge=lfs -text
4
+ *.bz2 filter=lfs diff=lfs merge=lfs -text
5
+ *.ckpt filter=lfs diff=lfs merge=lfs -text
6
+ *.ftz filter=lfs diff=lfs merge=lfs -text
7
+ *.gz filter=lfs diff=lfs merge=lfs -text
8
+ *.h5 filter=lfs diff=lfs merge=lfs -text
9
+ *.joblib filter=lfs diff=lfs merge=lfs -text
10
+ *.lfs.* filter=lfs diff=lfs merge=lfs -text
11
+ *.mlmodel filter=lfs diff=lfs merge=lfs -text
12
+ *.model filter=lfs diff=lfs merge=lfs -text
13
+ *.msgpack filter=lfs diff=lfs merge=lfs -text
14
+ *.npy filter=lfs diff=lfs merge=lfs -text
15
+ *.npz filter=lfs diff=lfs merge=lfs -text
16
+ *.onnx filter=lfs diff=lfs merge=lfs -text
17
+ *.ot filter=lfs diff=lfs merge=lfs -text
18
+ *.parquet filter=lfs diff=lfs merge=lfs -text
19
+ *.pb filter=lfs diff=lfs merge=lfs -text
20
+ *.pickle filter=lfs diff=lfs merge=lfs -text
21
+ *.pkl filter=lfs diff=lfs merge=lfs -text
22
+ *.pt filter=lfs diff=lfs merge=lfs -text
23
+ *.pth filter=lfs diff=lfs merge=lfs -text
24
+ *.rar filter=lfs diff=lfs merge=lfs -text
25
+ *.safetensors filter=lfs diff=lfs merge=lfs -text
26
+ saved_model/**/* filter=lfs diff=lfs merge=lfs -text
27
+ *.tar.* filter=lfs diff=lfs merge=lfs -text
28
+ *.tar filter=lfs diff=lfs merge=lfs -text
29
+ *.tflite filter=lfs diff=lfs merge=lfs -text
30
+ *.tgz filter=lfs diff=lfs merge=lfs -text
31
+ *.wasm filter=lfs diff=lfs merge=lfs -text
32
+ *.xz filter=lfs diff=lfs merge=lfs -text
33
+ *.zip filter=lfs diff=lfs merge=lfs -text
34
+ *.zst filter=lfs diff=lfs merge=lfs -text
35
+ *tfevents* filter=lfs diff=lfs merge=lfs -text
README.md ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ title: Deepseek R1 PF
3
+ emoji: 💬
4
+ colorFrom: yellow
5
+ colorTo: purple
6
+ sdk: gradio
7
+ sdk_version: 5.0.1
8
+ app_file: app.py
9
+ pinned: false
10
+ license: apache-2.0
11
+ ---
12
+
13
+ An example chatbot using [Gradio](https://gradio.app), [`huggingface_hub`](https://huggingface.co/docs/huggingface_hub/v0.22.2/en/index), and the [Hugging Face Inference API](https://huggingface.co/docs/api-inference/index).
app.py ADDED
@@ -0,0 +1,229 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import json
3
+ import gradio as gr
4
+ import torch
5
+ from transformers import (
6
+ TrainingArguments,
7
+ Trainer,
8
+ AutoModelForCausalLM,
9
+ AutoTokenizer,
10
+ DataCollatorForLanguageModeling
11
+ )
12
+ from datasets import Dataset
13
+ from peft import (
14
+ prepare_model_for_kbit_training,
15
+ LoraConfig,
16
+ get_peft_model
17
+ )
18
+
19
+ # Constants
20
+ MODEL_NAME = "deepseek-ai/DeepSeek-R1"
21
+ OUTPUT_DIR = "finetuned_models"
22
+ LOGS_DIR = "training_logs"
23
+
24
+ def save_uploaded_file(file):
25
+ """Save uploaded file and return its path"""
26
+ os.makedirs('uploads', exist_ok=True)
27
+ file_path = os.path.join('uploads', file.name)
28
+ with open(file_path, 'wb') as f:
29
+ f.write(file.read())
30
+ return file_path
31
+
32
+ def prepare_training_components(
33
+ data_path,
34
+ learning_rate,
35
+ num_epochs,
36
+ batch_size,
37
+ model_name=MODEL_NAME
38
+ ):
39
+ """Prepare model, tokenizer, and training arguments"""
40
+
41
+ # Create output directory with timestamp
42
+ import time
43
+ timestamp = time.strftime("%Y%m%d_%H%M%S")
44
+ specific_output_dir = os.path.join(OUTPUT_DIR, f"run_{timestamp}")
45
+ os.makedirs(specific_output_dir, exist_ok=True)
46
+ os.makedirs(LOGS_DIR, exist_ok=True)
47
+
48
+ # Load tokenizer and model
49
+ tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
50
+ model = AutoModelForCausalLM.from_pretrained(
51
+ model_name,
52
+ trust_remote_code=True,
53
+ torch_dtype=torch.float16,
54
+ load_in_8bit=True
55
+ )
56
+
57
+ # LoRA Configuration
58
+ lora_config = LoraConfig(
59
+ r=16,
60
+ lora_alpha=32,
61
+ target_modules=[
62
+ "q_proj", "k_proj", "v_proj", "o_proj",
63
+ "gate_proj", "up_proj", "down_proj"
64
+ ],
65
+ lora_dropout=0.05,
66
+ bias="none",
67
+ task_type="CAUSAL_LM"
68
+ )
69
+
70
+ # Prepare model
71
+ model = prepare_model_for_kbit_training(model)
72
+ model = get_peft_model(model, lora_config)
73
+
74
+ # Training Arguments
75
+ training_args = TrainingArguments(
76
+ output_dir=specific_output_dir,
77
+ num_train_epochs=num_epochs,
78
+ per_device_train_batch_size=batch_size,
79
+ learning_rate=learning_rate,
80
+ fp16=True,
81
+ gradient_accumulation_steps=8,
82
+ gradient_checkpointing=True,
83
+ logging_dir=os.path.join(LOGS_DIR, f"run_{timestamp}"),
84
+ logging_steps=10,
85
+ save_strategy="epoch",
86
+ evaluation_strategy="epoch",
87
+ save_total_limit=2,
88
+ )
89
+
90
+ # Load and prepare dataset
91
+ with open(data_path, 'r') as f:
92
+ raw_data = json.load(f)
93
+
94
+ # Convert to datasets format
95
+ dataset = Dataset.from_dict({
96
+ 'text': [item['text'] for item in raw_data]
97
+ })
98
+
99
+ # Create data collator
100
+ data_collator = DataCollatorForLanguageModeling(
101
+ tokenizer=tokenizer,
102
+ mlm=False
103
+ )
104
+
105
+ return {
106
+ 'model': model,
107
+ 'tokenizer': tokenizer,
108
+ 'training_args': training_args,
109
+ 'dataset': dataset,
110
+ 'data_collator': data_collator,
111
+ 'output_dir': specific_output_dir
112
+ }
113
+
114
+ def train_model(
115
+ file,
116
+ learning_rate=2e-4,
117
+ num_epochs=3,
118
+ batch_size=4,
119
+ progress=gr.Progress()
120
+ ):
121
+ """Training function for Gradio interface"""
122
+ try:
123
+ # Save uploaded file
124
+ file_path = save_uploaded_file(file)
125
+
126
+ # Prepare components
127
+ progress(0.2, desc="Preparing training components...")
128
+ components = prepare_training_components(
129
+ file_path,
130
+ learning_rate,
131
+ num_epochs,
132
+ batch_size
133
+ )
134
+
135
+ # Initialize trainer
136
+ progress(0.4, desc="Initializing trainer...")
137
+ trainer = Trainer(
138
+ model=components['model'],
139
+ args=components['training_args'],
140
+ train_dataset=components['dataset'],
141
+ data_collator=components['data_collator'],
142
+ )
143
+
144
+ # Train
145
+ progress(0.5, desc="Training model...")
146
+ trainer.train()
147
+
148
+ # Save model and tokenizer
149
+ progress(0.9, desc="Saving model...")
150
+ trainer.save_model()
151
+ components['tokenizer'].save_pretrained(components['output_dir'])
152
+
153
+ progress(1.0, desc="Training complete!")
154
+ return f"Training completed! Model saved in {components['output_dir']}"
155
+
156
+ except Exception as e:
157
+ return f"Error during training: {str(e)}"
158
+
159
+ # Create Gradio interface
160
+ def create_interface():
161
+ with gr.Blocks() as demo:
162
+ gr.Markdown("# DeepSeek-R1 Model Finetuning Interface")
163
+
164
+ with gr.Row():
165
+ with gr.Column():
166
+ file_input = gr.File(
167
+ label="Upload Training Data (JSON)",
168
+ type="binary",
169
+ file_types=[".json"]
170
+ )
171
+
172
+ learning_rate = gr.Slider(
173
+ minimum=1e-5,
174
+ maximum=1e-3,
175
+ value=2e-4,
176
+ label="Learning Rate"
177
+ )
178
+
179
+ num_epochs = gr.Slider(
180
+ minimum=1,
181
+ maximum=10,
182
+ value=3,
183
+ step=1,
184
+ label="Number of Epochs"
185
+ )
186
+
187
+ batch_size = gr.Slider(
188
+ minimum=1,
189
+ maximum=8,
190
+ value=4,
191
+ step=1,
192
+ label="Batch Size"
193
+ )
194
+
195
+ train_button = gr.Button("Start Training")
196
+
197
+ with gr.Column():
198
+ output = gr.Textbox(label="Training Status")
199
+
200
+ train_button.click(
201
+ fn=train_model,
202
+ inputs=[file_input, learning_rate, num_epochs, batch_size],
203
+ outputs=output
204
+ )
205
+
206
+ gr.Markdown("""
207
+ ## Instructions
208
+ 1. Upload your training data in JSON format:
209
+ ```json
210
+ [
211
+ {"text": "User: Question\nAssistant: Answer"},
212
+ {"text": "User: Another question\nAssistant: Another answer"}
213
+ ]
214
+ ```
215
+ 2. Adjust training parameters if needed
216
+ 3. Click 'Start Training'
217
+ 4. Wait for training to complete
218
+ """)
219
+
220
+ return demo
221
+
222
+ if __name__ == "__main__":
223
+ # Create necessary directories
224
+ os.makedirs(OUTPUT_DIR, exist_ok=True)
225
+ os.makedirs(LOGS_DIR, exist_ok=True)
226
+
227
+ # Launch Gradio interface
228
+ demo = create_interface()
229
+ demo.launch(share=True)
requirements.txt ADDED
@@ -0,0 +1 @@
 
 
1
+ huggingface_hub==0.25.2