File size: 3,342 Bytes
b347bad
 
e57eacb
 
 
b347bad
e57eacb
 
 
 
 
 
 
 
 
 
 
 
 
b347bad
 
 
 
e57eacb
 
 
 
 
 
b347bad
e57eacb
 
 
 
 
b347bad
 
 
 
 
 
 
 
 
 
 
 
 
 
e57eacb
b347bad
e57eacb
 
 
429ebd7
 
 
 
 
 
 
 
 
 
 
 
e57eacb
 
b347bad
 
 
 
429ebd7
b347bad
 
 
ff120f8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
import os
import subprocess
import uvicorn
from fastapi import FastAPI
from pydantic import BaseModel
import sysconfig

# Inicializar la aplicación FastAPI
app = FastAPI()

# Definir la estructura de entrada para el prompt de la API
class PromptRequest(BaseModel):
    prompt: str

# Ruta principal para ejecutar el modelo
@app.post("/generate/")
async def generate_text(request: PromptRequest):
    model_path = "/content/executorch/Llama-3.2-1B-Instruct-SpinQuant_INT4_EO8.pte"
    tokenizer_path = "/content/executorch/tokenizer.model"
    
    # Descargar los archivos si no existen
    download_files(model_path, tokenizer_path)
    
    prompt = request.prompt
    result = run_llama_model(model_path, tokenizer_path, prompt)
    
    return {"generated_text": result}

def run_command(command):
    """Ejecutar un comando en el shell y devolver la salida."""
    result = subprocess.run(command, shell=True, text=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    if result.returncode != 0:
        return f"Error ejecutando el comando: {result.stderr}"
    return result.stdout

def download_files(model_path, tokenizer_path):
    """Descargar el modelo y tokenizador si no están presentes."""
    if not os.path.exists(model_path):
        print(f"Descargando el modelo desde Hugging Face: {model_path}")
        run_command(f"wget https://huggingface.co/executorch-community/Llama-3.2-1B-Instruct-SpinQuant_INT4_EO8-ET/resolve/main/Llama-3.2-1B-Instruct-SpinQuant_INT4_EO8.pte -O {model_path}")
    else:
        print(f"El modelo ya está presente en: {model_path}")
    
    if not os.path.exists(tokenizer_path):
        print(f"Descargando el tokenizador desde Hugging Face: {tokenizer_path}")
        run_command(f"wget https://huggingface.co/executorch-community/Llama-3.2-1B-Instruct-SpinQuant_INT4_EO8-ET/resolve/main/tokenizer.model -O {tokenizer_path}")
    else:
        print(f"El tokenizador ya está presente en: {tokenizer_path}")

def run_llama_model(model_path, tokenizer_path, prompt):
    """Ejecutar el modelo Llama y generar texto."""
    cmd = f"cd /content/executorch/cmake-out/examples/models/llama && ./llama_main --model_path={model_path} --tokenizer_path={tokenizer_path} --prompt='{prompt}'"
    return run_command(cmd)

def install_requirements(lib_path):
    """Instalar dependencias de ejecutorch y del modelo Llama."""
    # Instalar dependencias para Executorch
    print("Instalando dependencias de Executorch...")
    run_command(f"cd /content/executorch && CMAKE_PREFIX_PATH={lib_path} EXECUTORCH_BUILD_XNNPACK=ON bash ./install_requirements.sh --pybind")
    print("Dependencias de Executorch instaladas.")

    # Instalar requerimientos adicionales para el modelo Llama
    print("Instalando dependencias para el modelo Llama...")
    run_command("cd /content/executorch/examples/models/llama && ./install_requirements.sh")
    print("Requerimientos de Llama instalados.")

# Iniciar el servidor Uvicorn directamente desde el código Python
if __name__ == "__main__":
    # Obtener la ruta del entorno Python
    lib_path = sysconfig.get_paths()["purelib"]
    print(f"Usando la ruta de la biblioteca Python: {lib_path}")

    # Instalar las dependencias necesarias
    install_requirements(lib_path)

    # Ejecutar el servidor Uvicorn
    uvicorn.run(app, host="0.0.0.0", port=7860)