EnzGamers commited on
Commit
fb7cb35
·
verified ·
1 Parent(s): 2b9a399

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +55 -24
app.py CHANGED
@@ -1,19 +1,19 @@
1
- from fastapi import FastAPI
2
  from pydantic import BaseModel
3
  import torch
4
  from transformers import AutoModelForCausalLM, AutoTokenizer
 
 
5
 
6
  # --- Configuration ---
7
- # ON UTILISE LE MODÈLE DEEPSEEK CODER 1.3B INSTRUCT
8
  MODEL_ID = "deepseek-ai/deepseek-coder-1.3b-instruct"
9
  DEVICE = "cpu"
10
 
11
  # --- Chargement du modèle et du tokenizer ---
12
- # Cette étape peut prendre quelques minutes au premier démarrage du Space
13
  print(f"Début du chargement du modèle : {MODEL_ID}")
14
  model = AutoModelForCausalLM.from_pretrained(
15
  MODEL_ID,
16
- torch_dtype=torch.bfloat16, # bfloat16 est efficace sur CPU
17
  device_map=DEVICE
18
  )
19
  tokenizer = AutoTokenizer.from_pretrained(MODEL_ID)
@@ -22,33 +22,64 @@ print("Modèle et tokenizer chargés avec succès sur le CPU.")
22
  # --- Création de l'application API ---
23
  app = FastAPI()
24
 
25
- # Modèle de données pour la requête d'entrée
26
- class PromptRequest(BaseModel):
27
- prompt: str
28
- max_new_tokens: int = 250
29
 
30
- # --- Définition de l'API ---
31
- @app.post("/generate")
32
- async def generate_code(request: PromptRequest):
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33
  """
34
- Endpoint pour générer du code à partir d'un prompt.
35
  """
36
- # Le modèle DeepSeek Instruct utilise un format de chat spécifique
37
- messages = [
38
- {'role': 'user', 'content': request.prompt}
39
- ]
40
 
41
- # Préparation des inputs pour le modèle
42
- inputs = tokenizer.apply_chat_template(messages, add_generation_prompt=True, return_tensors="pt").to(DEVICE)
 
 
 
 
43
 
44
- # Génération du code. Soyez patient, cela peut prendre plusieurs secondes sur CPU.
45
- outputs = model.generate(inputs, max_new_tokens=request.max_new_tokens, do_sample=True, temperature=0.2, top_k=50, top_p=0.95, num_return_sequences=1, eos_token_id=tokenizer.eos_token_id)
46
 
47
- # Décodage de la réponse
48
- response = tokenizer.decode(outputs[0][len(inputs[0]):], skip_special_tokens=True)
 
 
 
 
 
 
 
 
 
 
49
 
50
- return {"generated_text": response}
51
 
52
  @app.get("/")
53
  def root():
54
- return {"status": "API en ligne", "model_id": MODEL_ID, "message": "Ce modèle tourne sur un CPU gratuit."}
 
1
+ from fastapi import FastAPI, Request
2
  from pydantic import BaseModel
3
  import torch
4
  from transformers import AutoModelForCausalLM, AutoTokenizer
5
+ import time
6
+ import uuid
7
 
8
  # --- Configuration ---
 
9
  MODEL_ID = "deepseek-ai/deepseek-coder-1.3b-instruct"
10
  DEVICE = "cpu"
11
 
12
  # --- Chargement du modèle et du tokenizer ---
 
13
  print(f"Début du chargement du modèle : {MODEL_ID}")
14
  model = AutoModelForCausalLM.from_pretrained(
15
  MODEL_ID,
16
+ torch_dtype=torch.bfloat16,
17
  device_map=DEVICE
18
  )
19
  tokenizer = AutoTokenizer.from_pretrained(MODEL_ID)
 
22
  # --- Création de l'application API ---
23
  app = FastAPI()
24
 
25
+ # --- Modèles de données pour la compatibilité OpenAI ---
26
+ class ChatMessage(BaseModel):
27
+ role: str
28
+ content: str
29
 
30
+ class ChatCompletionRequest(BaseModel):
31
+ model: str
32
+ messages: list[ChatMessage]
33
+ max_tokens: int = 250
34
+
35
+ class ChatCompletionResponseChoice(BaseModel):
36
+ index: int = 0
37
+ message: ChatMessage
38
+ finish_reason: str = "stop"
39
+
40
+ class ChatCompletionResponse(BaseModel):
41
+ id: str
42
+ object: str = "chat.completion"
43
+ created: int
44
+ model: str
45
+ choices: list[ChatCompletionResponseChoice]
46
+
47
+ # --- Définition de l'API compatible OpenAI ---
48
+ @app.post("/v1/chat/completions")
49
+ async def create_chat_completion(request: ChatCompletionRequest):
50
  """
51
+ Endpoint compatible avec l'API OpenAI Chat Completions.
52
  """
53
+ # Extraire le dernier message utilisateur pour le prompt
54
+ user_prompt = ""
55
+ if request.messages and request.messages[-1].role == "user":
56
+ user_prompt = request.messages[-1].content
57
 
58
+ if not user_prompt:
59
+ return {"error": "No user prompt found"}
60
+
61
+ # Préparation des inputs pour le modèle DeepSeek
62
+ messages_for_model = [{'role': 'user', 'content': user_prompt}]
63
+ inputs = tokenizer.apply_chat_template(messages_for_model, add_generation_prompt=True, return_tensors="pt").to(DEVICE)
64
 
65
+ # Génération
66
+ outputs = model.generate(inputs, max_new_tokens=request.max_tokens, do_sample=True, temperature=0.2, top_k=50, top_p=0.95, num_return_sequences=1, eos_token_id=tokenizer.eos_token_id)
67
 
68
+ # Décodage
69
+ response_text = tokenizer.decode(outputs[0][len(inputs[0]):], skip_special_tokens=True)
70
+
71
+ # Formatage de la réponse au format OpenAI
72
+ response_message = ChatMessage(role="assistant", content=response_text)
73
+ choice = ChatCompletionResponseChoice(message=response_message)
74
+ completion_response = ChatCompletionResponse(
75
+ id=f"chatcmpl-{uuid.uuid4()}",
76
+ created=int(time.time()),
77
+ model=request.model,
78
+ choices=[choice]
79
+ )
80
 
81
+ return completion_response
82
 
83
  @app.get("/")
84
  def root():
85
+ return {"status": "API compatible OpenAI en ligne", "model_id": MODEL_ID}