Spaces:
Build error
Build error
Upload 4 files
Browse files- Dockerfile +60 -0
- download-model.py +30 -0
- export.py +79 -0
- upload.py +83 -0
Dockerfile
ADDED
@@ -0,0 +1,60 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
FROM debian:11-slim
|
2 |
+
|
3 |
+
# Variables de entorno
|
4 |
+
#Variables a modificar
|
5 |
+
ENV TOKEN="aGZfTUFMZEpmYnp1TU9oR01yaGZMcGJIQ0RKcGV6b2p0ZGNwTw=="
|
6 |
+
ENV REPO_ID="cognitivecomputations/TinyDolphin-2.8.2-1.1b-laser"
|
7 |
+
ENV MODEL_HF_DIR="/models"
|
8 |
+
ENV MODEL_GGUF_DIR="/gguf"
|
9 |
+
#ENV QUANTIZATION_TYPES=Q8_0
|
10 |
+
|
11 |
+
RUN useradd -m -u 1000 app
|
12 |
+
RUN apt update
|
13 |
+
RUN apt install -y \
|
14 |
+
make \
|
15 |
+
cmake \
|
16 |
+
clang \
|
17 |
+
gcc \
|
18 |
+
git \
|
19 |
+
curl \
|
20 |
+
sudo \
|
21 |
+
python3 \
|
22 |
+
python3-pip \
|
23 |
+
python3-dev
|
24 |
+
|
25 |
+
# Creación de la carpeta de destino
|
26 |
+
WORKDIR /root/
|
27 |
+
RUN mkdir ${MODEL_HF_DIR}
|
28 |
+
|
29 |
+
# Clonación del repositorio
|
30 |
+
WORKDIR /root/
|
31 |
+
RUN git clone https://github.com/ggerganov/llama.cpp
|
32 |
+
|
33 |
+
# Compilación del proyecto
|
34 |
+
WORKDIR /root/llama.cpp
|
35 |
+
RUN make
|
36 |
+
|
37 |
+
# Ejecución de la herramienta principal
|
38 |
+
RUN ./main --help
|
39 |
+
|
40 |
+
# Instalación de dependencias
|
41 |
+
RUN pip install -r requirements.txt
|
42 |
+
RUN pip install -U "huggingface_hub[cli]"
|
43 |
+
RUN pip install huggingface_hub
|
44 |
+
|
45 |
+
# Descarga del modelo en la carpeta especificada
|
46 |
+
COPY *.py .
|
47 |
+
RUN python3 download-model.py
|
48 |
+
# Conversión del modelo a GGUF
|
49 |
+
RUN python3 export.py
|
50 |
+
RUN rm -R ${MODEL_HF_DIR}
|
51 |
+
|
52 |
+
# Listado de archivos descargados
|
53 |
+
RUN ls -lh ${MODEL_GGUF_DIR}
|
54 |
+
RUN python3 upload.py
|
55 |
+
WORKDIR /home/app
|
56 |
+
RUN mv ${MODEL_GGUF_DIR}/*Q2_K.gguf /home/app/model.gguf
|
57 |
+
RUN mv /root/llama.cpp/ /home/app/
|
58 |
+
USER app
|
59 |
+
# Comando de ejecución
|
60 |
+
CMD ["llama.cpp/server", "-m", "model.gguf", "--host", "0.0.0.0", "--port", "7860"]
|
download-model.py
ADDED
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import os
|
2 |
+
import base64
|
3 |
+
from huggingface_hub import HfApi, hf_hub_download
|
4 |
+
|
5 |
+
# Obtener el token de la variable de entorno y descodificarlo
|
6 |
+
token_base64 = os.getenv("TOKEN")
|
7 |
+
token = base64.b64decode(token_base64).decode("utf-8")
|
8 |
+
|
9 |
+
# Obtener el repo_id de la variable de entorno
|
10 |
+
repo_id = os.getenv("REPO_ID")
|
11 |
+
|
12 |
+
# Crear una instancia de HfApi para listar los archivos del repositorio
|
13 |
+
api = HfApi()
|
14 |
+
archivos = api.list_repo_files(repo_id=repo_id, token=token)
|
15 |
+
|
16 |
+
# Crear la carpeta "model" si no existe
|
17 |
+
destino = os.getenv("MODEL_HF_DIR")
|
18 |
+
os.makedirs(destino, exist_ok=True)
|
19 |
+
|
20 |
+
# Descargar todos los archivos del repositorio a la carpeta de destino
|
21 |
+
for archivo in archivos:
|
22 |
+
ruta_archivo = hf_hub_download(
|
23 |
+
repo_id=repo_id,
|
24 |
+
filename=archivo,
|
25 |
+
token=token,
|
26 |
+
local_dir=destino,
|
27 |
+
)
|
28 |
+
print(f"Archivo {archivo} descargado a la ruta {ruta_archivo}.")
|
29 |
+
|
30 |
+
print(f"Todo el contenido del repositorio {repo_id} ha sido descargado en la carpeta '{destino}'.")
|
export.py
ADDED
@@ -0,0 +1,79 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import os
|
2 |
+
import subprocess
|
3 |
+
|
4 |
+
# Definir la ruta de la carpeta donde se almacenan los archivos Python
|
5 |
+
carpeta = os.getcwd() # Ruta actual de trabajo
|
6 |
+
|
7 |
+
# Definir las variables de entorno
|
8 |
+
model_hf_dir = os.getenv("MODEL_HF_DIR")
|
9 |
+
model_gguf_dir = os.getenv("MODEL_GGUF_DIR", os.path.join(carpeta, "MODEL_GGUF_DIR"))
|
10 |
+
quantization_types = os.getenv("QUANTIZATION_TYPES", "Q8_0, Q6_K, Q5_K, Q4_K, Q3_K, Q2_K")
|
11 |
+
|
12 |
+
# Comando base para ejecutar los archivos Python
|
13 |
+
comando_base = "python3"
|
14 |
+
|
15 |
+
# Lista de comandos predefinidos
|
16 |
+
comandos_predefinidos = [
|
17 |
+
f"{comando_base} convert.py {model_hf_dir} --outtype f16",
|
18 |
+
f"{comando_base} convert-hf-to-gguf.py {model_hf_dir}",
|
19 |
+
f"{comando_base} convert-lora-to-ggml.py {model_hf_dir}",
|
20 |
+
]
|
21 |
+
|
22 |
+
# Variable para controlar si se encontró un archivo ejecutado exitosamente
|
23 |
+
ejecucion_exitosa = False
|
24 |
+
|
25 |
+
# Ejecutar los comandos predefinidos uno por uno
|
26 |
+
for comando in comandos_predefinidos:
|
27 |
+
try:
|
28 |
+
# Ejecutar el comando
|
29 |
+
print(f"Ejecutando: {comando}")
|
30 |
+
resultado = subprocess.run(comando, shell=True, check=True)
|
31 |
+
# Si el comando se ejecuta sin errores, detener el bucle
|
32 |
+
ejecucion_exitosa = True
|
33 |
+
print(f"Ejecución exitosa del comando: {comando}")
|
34 |
+
break
|
35 |
+
except subprocess.CalledProcessError:
|
36 |
+
# Si el comando falla, continuar con el siguiente comando predefinido
|
37 |
+
print(f"Error al ejecutar {comando}, continuando con el siguiente comando predefinido...")
|
38 |
+
|
39 |
+
# Si se ejecutó exitosamente, realizar las siguientes acciones
|
40 |
+
if ejecucion_exitosa:
|
41 |
+
# Ruta del archivo ggml-model-f16.gguf en la carpeta MODEL_HF_DIR
|
42 |
+
archivo_gguf = os.path.join(model_hf_dir, "ggml-model-f16.gguf")
|
43 |
+
|
44 |
+
# Crear la carpeta MODEL_GGUF_DIR si no existe
|
45 |
+
os.makedirs(model_gguf_dir, exist_ok=True)
|
46 |
+
|
47 |
+
# Mover el archivo ggml-model-f16.gguf a MODEL_GGUF_DIR
|
48 |
+
nueva_ubicacion_gguf = os.path.join(model_gguf_dir, "ggml-model-f16.gguf")
|
49 |
+
os.rename(archivo_gguf, nueva_ubicacion_gguf)
|
50 |
+
print(f"Archivo ggml-model-f16.gguf movido a {nueva_ubicacion_gguf}")
|
51 |
+
|
52 |
+
# Obtener los tipos de cuantización de QUANTIZATION_TYPES y separarlos por comas
|
53 |
+
tipos_cuantizacion = quantization_types.split(",")
|
54 |
+
|
55 |
+
# Ejecutar ./quantize para cada tipo de cuantización
|
56 |
+
for tipo in tipos_cuantizacion:
|
57 |
+
try:
|
58 |
+
comando_quantize = f"./quantize {nueva_ubicacion_gguf} {tipo}"
|
59 |
+
print(f"Ejecutando: {comando_quantize}")
|
60 |
+
# Ejecutar el comando quantize
|
61 |
+
subprocess.run(comando_quantize, shell=True, check=True)
|
62 |
+
except subprocess.CalledProcessError:
|
63 |
+
# Si el comando falla, continuar con el siguiente tipo de cuantización
|
64 |
+
print(f"Error al ejecutar {comando_quantize}, continuando con el siguiente tipo de cuantización...")
|
65 |
+
|
66 |
+
# Mostrar los archivos en la carpeta model_hf_dir
|
67 |
+
print(f"\nContenido de la carpeta {model_hf_dir}:")
|
68 |
+
contenido = os.listdir(model_hf_dir)
|
69 |
+
for archivo in contenido:
|
70 |
+
print(archivo)
|
71 |
+
|
72 |
+
# Mostrar el contenido del archivo de registro "convert.log" si existe
|
73 |
+
log_path = os.path.join(carpeta, "convert.log")
|
74 |
+
if os.path.exists(log_path):
|
75 |
+
print("\nContenido de convert.log:")
|
76 |
+
with open(log_path, 'r') as log_file:
|
77 |
+
print(log_file.read())
|
78 |
+
else:
|
79 |
+
print("\nEl archivo convert.log no existe.")
|
upload.py
ADDED
@@ -0,0 +1,83 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import os
|
2 |
+
import base64
|
3 |
+
from huggingface_hub import HfApi, upload_folder
|
4 |
+
|
5 |
+
def main():
|
6 |
+
# Obtener el valor de la variable de entorno REPO_ID
|
7 |
+
repo_id = os.getenv('REPO_ID')
|
8 |
+
if repo_id is None:
|
9 |
+
print("REPO_ID no está definida en las variables de entorno.")
|
10 |
+
return
|
11 |
+
|
12 |
+
# Obtener la variable de entorno TOKEN para autenticarse en Hugging Face
|
13 |
+
token_base64 = os.getenv('TOKEN')
|
14 |
+
if token_base64 is None:
|
15 |
+
print("TOKEN no está definida en las variables de entorno.")
|
16 |
+
return
|
17 |
+
|
18 |
+
# Decodificar el token de base64
|
19 |
+
token = base64.b64decode(token_base64).decode('utf-8')
|
20 |
+
|
21 |
+
# Configuración para la API de Hugging Face
|
22 |
+
api = HfApi()
|
23 |
+
|
24 |
+
# Obtener el nombre de usuario utilizando el token
|
25 |
+
try:
|
26 |
+
user_info = api.whoami(token=token)
|
27 |
+
username = user_info['name']
|
28 |
+
print(f"Nombre de usuario obtenido: {username}")
|
29 |
+
except Exception as e:
|
30 |
+
print(f"Error al obtener el nombre de usuario: {e}")
|
31 |
+
return
|
32 |
+
|
33 |
+
# Eliminar el prefijo 'Usuario/' del valor de REPO_ID para obtener solo el nombre del repositorio
|
34 |
+
# Se asume que REPO_ID tiene el formato "Usuario/NombreDeRepo"
|
35 |
+
_, nombre_repo = repo_id.split('/')
|
36 |
+
|
37 |
+
# Crear el nuevo nombre del repositorio agregando '-GGUF' al nombre original
|
38 |
+
new_repo_name = f"{nombre_repo}-GGUF"
|
39 |
+
|
40 |
+
# Crear `repo_id` para el nuevo repositorio utilizando el nombre de usuario
|
41 |
+
new_repo_id = f"{username}/{new_repo_name}"
|
42 |
+
|
43 |
+
# Crear el repositorio con el nuevo nombre si no existe
|
44 |
+
try:
|
45 |
+
api.create_repo(repo_id=new_repo_id, token=token, private=True)
|
46 |
+
print(f"Repositorio '{new_repo_id}' creado en Hugging Face como privado.")
|
47 |
+
except Exception as e:
|
48 |
+
print(f"El repositorio '{new_repo_id}' ya existe o se produjo un error: {e}")
|
49 |
+
|
50 |
+
# Ruta a la carpeta que contiene los archivos para subir
|
51 |
+
model_gguf_dir = os.getenv('MODEL_GGUF_DIR')
|
52 |
+
if model_gguf_dir is None:
|
53 |
+
print("MODEL_GGUF_DIR no está definida en las variables de entorno.")
|
54 |
+
return
|
55 |
+
|
56 |
+
# Renombrar archivos en MODEL_GGUF_DIR reemplazando 'ggml-model-' por el nuevo nombre de repositorio
|
57 |
+
for archivo in os.listdir(model_gguf_dir):
|
58 |
+
if archivo.startswith("ggml-model-"):
|
59 |
+
# Crear el nuevo nombre reemplazando 'ggml-model-' por el nombre del nuevo repositorio
|
60 |
+
nuevo_nombre_archivo = archivo.replace("ggml-model-", nombre_repo + "-")
|
61 |
+
|
62 |
+
# Ruta completa del archivo original y del archivo renombrado
|
63 |
+
ruta_archivo_original = os.path.join(model_gguf_dir, archivo)
|
64 |
+
ruta_nuevo_archivo = os.path.join(model_gguf_dir, nuevo_nombre_archivo)
|
65 |
+
|
66 |
+
# Renombrar el archivo
|
67 |
+
os.rename(ruta_archivo_original, ruta_nuevo_archivo)
|
68 |
+
print(f"Renombrado {archivo} a {nuevo_nombre_archivo}")
|
69 |
+
|
70 |
+
# Subir toda la carpeta MODEL_GGUF_DIR al repositorio en Hugging Face
|
71 |
+
try:
|
72 |
+
# Usar `upload_folder` para subir toda la carpeta
|
73 |
+
upload_folder(
|
74 |
+
folder_path=model_gguf_dir,
|
75 |
+
repo_id=new_repo_id,
|
76 |
+
token=token
|
77 |
+
)
|
78 |
+
print(f"Todo el contenido de '{model_gguf_dir}' ha sido subido al repositorio '{new_repo_id}' en Hugging Face.")
|
79 |
+
except Exception as e:
|
80 |
+
print(f"Error al subir la carpeta '{model_gguf_dir}' al repositorio '{new_repo_id}': {e}")
|
81 |
+
|
82 |
+
if __name__ == '__main__':
|
83 |
+
main()
|