# Uso de sample-factory en Hugging Face

[`sample-factory`](https://github.com/alex-petrenko/sample-factory) es una base de código para el aprendizaje por refuerzo asíncrono de alto rendimiento. Cuenta con integraciones con Hugging Face Hub para compartir modelos con resultados de evaluación y métricas de entrenamiento.

## Explorando sample-factory en el Hub

Puedes encontrar modelos de `sample-factory` filtrando a la izquierda de la [página de modelos](https://huggingface.co/models?library=sample-factory).

Todos los modelos del Hub vienen con características útiles:
1. Una tarjeta de modelo generada automáticamente con una descripción, una configuración de entrenamiento y más.
2. Etiquetas de metadatos que ayudan a la descubribilidad.
3. Resultados de evaluación para comparar con otros modelos.
4. Un widget de video donde puedes ver a tu agente en acción.

## Instalar la biblioteca
Para instalar la biblioteca `sample-factory`, necesitas instalar el paquete:

`pip install sample-factory`

SF se sabe que funciona en Linux y MacOS. En este momento no hay soporte para Windows.

## Carga de modelos desde el Hub
### Usando load_from_hub

Para descargar un modelo del Hugging Face Hub para usarlo con Sample-Factory, use el script `load_from_hub`:

```
python -m sample_factory.huggingface.load_from_hub -r <HuggingFace_repo_id> -d <train_dir_path>
```

Los argumentos de línea de comandos son:

- `-r`: El ID del repositorio del repositorio de HF desde el que se descargará. El ID del repositorio debe estar en el formato `<username>/<repo_name>`
- `-d`: Un argumento opcional para especificar el directorio donde se guardará el experimento. El valor predeterminado es `./train_dir`, que guardará el repositorio en `./train_dir/<repo_name>`

### Descargar el repositorio del modelo directamente

Los repositorios de Hugging Face se pueden descargar directamente usando `git clone`:

```
git clone git@hf.co:<Name of HuggingFace Repo> # example: git clone git@hf.co:bigscience/bloom
```

## Uso de modelos descargados con Sample-Factory

Después de descargar el modelo, puedes ejecutar los modelos del repositorio con el script enjoy correspondiente a tu entorno. Por ejemplo, si estás descargando un modelo `mujoco-ant`, se puede ejecutar con:

```
python -m sf_examples.mujoco.enjoy_mujoco --algo=APPO --env=mujoco_ant --experiment=<repo_name> --train_dir=./train_dir
```

Tenga en cuenta que es posible que tenga que especificar `--train_dir` si su train_dir local tiene una ruta diferente a la del `cfg.json`

## Compartir tus modelos
### Usando push_to_hub

Si deseas subir sin generar métricas de evaluación ni un video de reproducción, puedes usar el script `push_to_hub`:

```
python -m sample_factory.huggingface.push_to_hub -r <hf_username>/<hf_repo_name> -d <experiment_dir_path>
```

Los argumentos de línea de comandos son:

- `-r`: El repo_id para guardar en HF Hub. Es el mismo que `hf_repository` en el script enjoy y debe estar en el formato `<hf_username>/<hf_repo_name>`
- `-d`: La ruta completa al directorio de su experimento para subir

### Usando enjoy.py

Puedes subir tus modelos al Hub usando el script `enjoy` de tu entorno con la bandera `--push_to_hub`. La subida mediante `enjoy` también puede generar métricas de evaluación y un video de reproducción.

Las métricas de evaluación se generan ejecutando su modelo en el entorno especificado durante un número de episodios e informando la recompensa media y la desviación estándar de esas ejecuciones.

Otros argumentos de línea de comandos relevantes son:

- `--hf_repository`: El repositorio al que se enviarán los datos. Debe tener el formato `<username>/<repo_name>`. El modelo se guardará en `https://huggingface.co/<username>/<repo_name>`
- `--max_num_episodes`: Número de episodios a evaluar antes de subir. Se utiliza para generar métricas de evaluación. Se recomienda usar varios episodios para generar una media y una desviación estándar precisas.
- `--max_num_frames`: Número de fotogramas a evaluar antes de subir. Una alternativa a `max_num_episodes`
- `--no_render`: Una bandera que deshabilita la renderización y la visualización de los pasos del entorno. Se recomienda establecer esta bandera para acelerar el proceso de evaluación.

También puedes guardar un video del modelo durante la evaluación para subirlo al hub con la bandera `--save_video`

- `--video_frames`: El número de fotogramas que se renderizarán en el video. El valor predeterminado es -1, lo que renderiza un episodio completo
- `--video_name`: El nombre con el que se guardará el video. Si es `None`, se guardará como `replay.mp4` en el directorio de tu experimento

Por ejemplo:

```
python -m sf_examples.mujoco_examples.enjoy_mujoco --algo=APPO --env=mujoco_ant --experiment=<repo_name> --train_dir=./train_dir --max_num_episodes=10 --push_to_hub --hf_username=<username> --hf_repository=<hf_repo_name> --save_video --no_render
```

