HirCoir commited on
Commit
aab6e33
1 Parent(s): 5825cfd

Upload 4 files

Browse files
Files changed (4) hide show
  1. Dockerfile +60 -0
  2. download-model.py +30 -0
  3. export.py +79 -0
  4. 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()