Construir desde la fuente

Cree un paquete pip de TensorFlow desde el código fuente e instálelo en Ubuntu Linux y macOS. Si bien las instrucciones pueden funcionar para otros sistemas, solo están probadas y son compatibles con Ubuntu y macOS.

Configuración para Linux y macOS

Instale las siguientes herramientas de compilación para configurar su entorno de desarrollo.

Instale Python y las dependencias del paquete TensorFlow

ubuntu

sudo apt install python3-dev python3-pip

macos

Requiere Xcode 9.2 o posterior.

Instale usando el administrador de paquetes Homebrew :

brew install python

Instale las dependencias del paquete pip de TensorFlow (si usa un entorno virtual, omita el argumento --user ):

pip install -U --user pip

Instalar Bazel

Para construir TensorFlow, necesitará instalar Bazel. Bazelisk es una manera fácil de instalar Bazel y descarga automáticamente la versión correcta de Bazel para TensorFlow. Para facilitar su uso, agregue Bazelisk como ejecutable bazel en su PATH .

Si Bazelisk no está disponible, puede instalar Bazel manualmente. Asegúrese de instalar la versión correcta de Bazel desde el archivo .bazelversion de TensorFlow.

Clang es un compilador de C/C++/Objective-C que se compila en C++ basado en LLVM. Es el compilador predeterminado para compilar TensorFlow a partir de TensorFlow 2.13. La versión compatible actualmente es LLVM/Clang 17.

Los paquetes nocturnos de LLVM Debian/Ubuntu proporcionan un script de instalación automática y paquetes para la instalación manual en Linux. Asegúrese de ejecutar el siguiente comando si agrega manualmente el repositorio llvm apt a las fuentes de su paquete:

sudo apt-get update && sudo apt-get install -y llvm-17 clang-17

Ahora que /usr/lib/llvm-17/bin/clang es la ruta real a clang en este caso.

Alternativamente, puede descargar y descomprimir el Clang + LLVM 17 prediseñado.

A continuación se muestra un ejemplo de los pasos que puede seguir para configurar los archivos binarios Clang + LLVM 17 descargados en los sistemas operativos Debian/Ubuntu:

  1. Cambie al directorio de destino deseado: cd <desired directory>

  2. Cargue y extraiga un archivo comprimido... (adecuado a su arquitectura):

    wget https://github.com/llvm/llvm-project/releases/download/llvmorg-17.0.2/clang+llvm-17.0.2-x86_64-linux-gnu-ubuntu-22.04.tar.xz
    
    tar -xvf clang+llvm-17.0.2-x86_64-linux-gnu-ubuntu-22.04.tar.xz
    

  3. Copie el contenido extraído (directorios y archivos) a /usr (es posible que necesite permisos sudo y el directorio correcto puede variar según la distribución). Esto instala efectivamente Clang y LLVM y los agrega a la ruta. No deberías tener que reemplazar nada, a menos que tengas una instalación previa, en cuyo caso deberás reemplazar los archivos:

    cp -r clang+llvm-17.0.2-x86_64-linux-gnu-ubuntu-22.04/* /usr

  4. Verifique la versión de binarios Clang + LLVM 17 obtenida:

    clang --version

  5. Ahora que /usr/bin/clang es la ruta real a su nuevo sonido metálico. Puede ejecutar el script ./configure o configurar manualmente las variables de entorno CC y BAZEL_COMPILER en esta ruta.

Instale soporte para GPU (opcional, solo Linux)

No hay soporte de GPU para macOS.

Lea la guía de soporte de GPU para instalar los controladores y el software adicional necesarios para ejecutar TensorFlow en una GPU.

Descargue el código fuente de TensorFlow

Utilice Git para clonar el repositorio de TensorFlow :

git clone https://github.com/tensorflow/tensorflow.git
cd tensorflow

El repositorio tiene como valor predeterminado la rama de desarrollo master . También puede consultar una rama de lanzamiento para compilar:

git checkout branch_name  # r2.2, r2.3, etc.

Configurar la compilación

Las compilaciones de TensorFlow se configuran mediante el archivo .bazelrc en el directorio raíz del repositorio. Los scripts ./configure o ./configure.py se pueden utilizar para ajustar configuraciones comunes.

Ejecute el script ./configure desde el directorio raíz del repositorio. Este script le solicitará la ubicación de las dependencias de TensorFlow y le solicitará opciones de configuración de compilación adicionales (indicadores del compilador, por ejemplo). Consulte la sección Sesión de muestra para obtener más detalles.

./configure

También hay una versión Python de este script, ./configure.py . Si utiliza un entorno virtual, python configure.py prioriza las rutas dentro del entorno, mientras que ./configure prioriza las rutas fuera del entorno. En ambos casos puedes cambiar el valor predeterminado.

Sesión de muestra

A continuación se muestra una ejecución de muestra del script ./configure (su sesión puede diferir):

Opciones de configuración

Soporte de GPU

desde v.2.18.0

Para compatibilidad con GPU , establezca cuda=Y durante la configuración y especifique las versiones de CUDA y cuDNN si es necesario. Bazel descargará los paquetes CUDA y CUDNN automáticamente o señalará las redistribuciones CUDA/CUDNN/NCCL en el sistema de archivos local si es necesario.

antes de la v.2.18.0

Para compatibilidad con GPU , establezca cuda=Y durante la configuración y especifique las versiones de CUDA y cuDNN. Si su sistema tiene varias versiones de CUDA o cuDNN instaladas, configure explícitamente la versión en lugar de confiar en la predeterminada. ./configure crea enlaces simbólicos a las bibliotecas CUDA de su sistema, por lo que si actualiza las rutas de su biblioteca CUDA, este paso de configuración debe ejecutarse nuevamente antes de compilar.

Optimizaciones

Para los indicadores de optimización de compilación, el valor predeterminado ( -march=native ) optimiza el código generado para el tipo de CPU de su máquina. Sin embargo, si construye TensorFlow para un tipo de CPU diferente, considere un indicador de optimización más específico. Consulte el manual de GCC para ver ejemplos.

Configuraciones preconfiguradas

Hay algunas configuraciones de compilación preconfiguradas disponibles que se pueden agregar al comando bazel build , por ejemplo:

  • --config=dbg : compila con información de depuración. Consulte CONTRIBUTING.md para obtener más detalles.
  • --config=mkl : compatibilidad con Intel® MKL-DNN .
  • --config=monolithic : configuración para una compilación monolítica mayoritariamente estática.

Construya e instale el paquete pip

Opciones de construcción de Bazel

Consulte la referencia de la línea de comandos de Bazel para conocer las opciones de compilación .

Construir TensorFlow desde el código fuente puede consumir mucha RAM. Si su sistema tiene limitaciones de memoria, limite el uso de RAM de Bazel con: --local_ram_resources=2048 .

Los paquetes oficiales de TensorFlow están creados con una cadena de herramientas Clang que cumple con el estándar de paquetes manylinux2014.

Construye el paquete

Para crear un paquete pip, debe especificar el indicador --repo_env=WHEEL_NAME . Dependiendo del nombre proporcionado, se creará el paquete, por ejemplo:

Para construir el paquete de CPU tensorflow:

bazel build //tensorflow/tools/pip_package:wheel --repo_env=WHEEL_NAME=tensorflow_cpu

Para construir el paquete GPU tensorflow:

bazel build //tensorflow/tools/pip_package:wheel --repo_env=WHEEL_NAME=tensorflow --config=cuda --config=cuda_wheel

Para construir el paquete de TPU tensorflow:

bazel build //tensorflow/tools/pip_package:wheel --repo_env=WHEEL_NAME=tensorflow_tpu --config=tpu

Para crear un paquete nocturno, configure tf_nightly en lugar de tensorflow , por ejemplo, para crear un paquete nocturno de CPU:

bazel build //tensorflow/tools/pip_package:wheel --repo_env=WHEEL_NAME=tf_nightly_cpu

Como resultado, la rueda generada se ubicará en

bazel-bin/tensorflow/tools/pip_package/wheel_house/

Instalar el paquete

El nombre del archivo .whl generado depende de la versión de TensorFlow y de su plataforma. Utilice pip install para instalar el paquete, por ejemplo:

pip install bazel-bin/tensorflow/tools/pip_package/wheel_house/tensorflow-version-tags.whl

Compilaciones de Docker Linux

Las imágenes de desarrollo de Docker de TensorFlow son una forma sencilla de configurar un entorno para crear paquetes de Linux desde el código fuente. Estas imágenes ya contienen el código fuente y las dependencias necesarias para construir TensorFlow. Vaya a la guía de TensorFlow Docker para obtener instrucciones de instalación y la lista de etiquetas de imágenes disponibles .

solo CPU

El siguiente ejemplo utiliza la imagen :devel para crear un paquete solo para CPU a partir del último código fuente de TensorFlow. Consulte la guía de Docker para conocer las etiquetas -devel de TensorFlow disponibles.

Descargue la imagen de desarrollo más reciente e inicie un contenedor Docker que usará para compilar el paquete pip :

docker pull tensorflow/tensorflow:devel
docker run -it -w /tensorflow_src -v $PWD:/mnt -e HOST_PERMS="$(id -u):$(id -g)" \
    tensorflow/tensorflow:devel bash

git pull  # within the container, download the latest source code

El comando docker run anterior inicia un shell en el directorio /tensorflow_src , la raíz del árbol de origen. Monta el directorio actual del host en el directorio /mnt del contenedor y pasa la información del usuario del host al contenedor a través de una variable ambiental (usada para establecer permisos; Docker puede hacer que esto sea complicado).

Alternativamente, para crear una copia de host de TensorFlow dentro de un contenedor, monte el árbol de origen del host en el directorio /tensorflow del contenedor:

docker run -it -w /tensorflow -v /path/to/tensorflow:/tensorflow -v $PWD:/mnt \
    -e HOST_PERMS="\\((id -u):\\)(id -g)" tensorflow/tensorflow:devel bash

Con el árbol de origen configurado, cree el paquete TensorFlow dentro del entorno virtual del contenedor:

  1. Opcional: Configure la compilación: esto solicita al usuario que responda preguntas de configuración de la compilación.
  2. Construya el paquete pip .
  3. Ajuste los permisos de propiedad del archivo fuera del contenedor.
./configure  # if necessary

bazel build //tensorflow/tools/pip_package:wheel --repo_env=WHEEL_NAME=tensorflow_cpu --config=opt
`
chown $HOST_PERMS bazel-bin/tensorflow/tools/pip_package/wheel_house/tensorflow-version-tags.whl

Instale y verifique el paquete dentro del contenedor:

pip uninstall tensorflow  # remove current version

pip install bazel-bin/tensorflow/tools/pip_package/wheel_house/tensorflow-version-tags.whl
cd /tmp  # don't import from source directory
python -c "import tensorflow as tf; print(tf.__version__)"

En su máquina host, el paquete pip de TensorFlow está en el directorio actual (con permisos de usuario del host): ./tensorflow- version - tags .whl

Soporte de GPU

Docker es la forma más sencilla de crear compatibilidad con GPU para TensorFlow, ya que la máquina host solo requiere el controlador NVIDIA® (no es necesario instalar el kit de herramientas NVIDIA® CUDA® ). Consulte la guía de soporte de GPU y la guía de TensorFlow Docker para configurar nvidia-docker (solo Linux).

El siguiente ejemplo descarga la imagen de TensorFlow :devel-gpu y usa nvidia-docker para ejecutar el contenedor habilitado para GPU. Esta imagen de desarrollo está configurada para crear un paquete pip con soporte para GPU:

docker pull tensorflow/tensorflow:devel-gpu
docker run --gpus all -it -w /tensorflow -v $PWD:/mnt -e HOST_PERMS="$(id -u):$(id -g)" \
    tensorflow/tensorflow:devel-gpu bash
git pull  # within the container, download the latest source code

Luego, dentro del entorno virtual del contenedor, cree el paquete TensorFlow con soporte para GPU:

./configure  # if necessary

bazel build //tensorflow/tools/pip_package:wheel --repo_env=WHEEL_NAME=tensorflow --config=cuda --config=cuda_wheel --config=opt

chown $HOST_PERMS bazel-bin/tensorflow/tools/pip_package/wheel_house/tensorflow-version-tags.whl

Instale y verifique el paquete dentro del contenedor y busque una GPU:

pip uninstall tensorflow  # remove current version

pip install bazel-bin/tensorflow/tools/pip_package/wheel_house/tensorflow-version-tags.whl
cd /tmp  # don't import from source directory
python -c "import tensorflow as tf; print(\"Num GPUs Available: \", len(tf.config.list_physical_devices('GPU')))"

Configuraciones de compilación probadas

linux

UPC

Versión Versión de Python Compilador herramientas de construcción
tensorflow-2.17.0 3.9-3.12 Sonido metálico 17.0.6 Bazel 6.5.0
tensorflow-2.16.1 3.9-3.12 Sonido metálico 17.0.6 Bazel 6.5.0
tensorflow-2.15.0 3.9-3.11 Sonido metálico 16.0.0 Bazel 6.1.0
tensorflow-2.14.0 3.9-3.11 Sonido metálico 16.0.0 Bazel 6.1.0
tensorflow-2.13.0 3.8-3.11 Sonido metálico 16.0.0 Bazel 5.3.0
tensorflow-2.12.0 3.8-3.11 CCG 9.3.1 Bazel 5.3.0
tensorflow-2.11.0 3.7-3.10 CCG 9.3.1 Bazel 5.3.0
tensorflow-2.10.0 3.7-3.10 CCG 9.3.1 Bazel 5.1.1
tensorflow-2.9.0 3.7-3.10 CCG 9.3.1 Bazel 5.0.0
tensorflow-2.8.0 3.7-3.10 CCG 7.3.1 Bazel 4.2.1
tensorflow-2.7.0 3.7-3.9 CCG 7.3.1 Bazel 3.7.2
tensorflow-2.6.0 3.6-3.9 CCG 7.3.1 Bazel 3.7.2
tensorflow-2.5.0 3.6-3.9 CCG 7.3.1 Bazel 3.7.2
tensorflow-2.4.0 3.6-3.8 CCG 7.3.1 Bazel 3.1.0
tensorflow-2.3.0 3.5-3.8 CCG 7.3.1 Bazel 3.1.0
tensorflow-2.2.0 3.5-3.8 CCG 7.3.1 Bazel 2.0.0
tensorflow-2.1.0 2,7, 3,5-3,7 CCG 7.3.1 Bazel 0.27.1
tensorflow-2.0.0 2.7, 3.3-3.7 CCG 7.3.1 Bazel 0.26.1
tensorflow-1.15.0 2.7, 3.3-3.7 CCG 7.3.1 Bazel 0.26.1
tensorflow-1.14.0 2.7, 3.3-3.7 CCG 4.8 Bazel 0.24.1
tensorflow-1.13.1 2.7, 3.3-3.7 CCG 4.8 Bazel 0.19.2
tensorflow-1.12.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.15.0
tensorflow-1.11.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.15.0
tensorflow-1.10.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.15.0
tensorflow-1.9.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.11.0
tensorflow-1.8.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.10.0
tensorflow-1.7.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.10.0
tensorflow-1.6.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.9.0
tensorflow-1.5.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.8.0
tensorflow-1.4.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.5.4
tensorflow-1.3.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.4.5
tensorflow-1.2.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.4.5
tensorflow-1.1.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.4.2
tensorflow-1.0.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.4.2

GPU

Versión Versión de Python Compilador herramientas de construcción cuDNN CUDA
tensorflow-2.17.0 3.9-3.12 Sonido metálico 17.0.6 Bazel 6.5.0 8.9 12.3
tensorflow-2.16.1 3.9-3.12 Sonido metálico 17.0.6 Bazel 6.5.0 8.9 12.3
tensorflow-2.15.0 3.9-3.11 Sonido metálico 16.0.0 Bazel 6.1.0 8.9 12.2
tensorflow-2.14.0 3.9-3.11 Sonido metálico 16.0.0 Bazel 6.1.0 8.7 11.8
tensorflow-2.13.0 3.8-3.11 Sonido metálico 16.0.0 Bazel 5.3.0 8.6 11.8
tensorflow-2.12.0 3.8-3.11 CCG 9.3.1 Bazel 5.3.0 8.6 11.8
tensorflow-2.11.0 3.7-3.10 CCG 9.3.1 Bazel 5.3.0 8.1 11.2
tensorflow-2.10.0 3.7-3.10 CCG 9.3.1 Bazel 5.1.1 8.1 11.2
tensorflow-2.9.0 3.7-3.10 CCG 9.3.1 Bazel 5.0.0 8.1 11.2
tensorflow-2.8.0 3.7-3.10 CCG 7.3.1 Bazel 4.2.1 8.1 11.2
tensorflow-2.7.0 3.7-3.9 CCG 7.3.1 Bazel 3.7.2 8.1 11.2
tensorflow-2.6.0 3.6-3.9 CCG 7.3.1 Bazel 3.7.2 8.1 11.2
tensorflow-2.5.0 3.6-3.9 CCG 7.3.1 Bazel 3.7.2 8.1 11.2
tensorflow-2.4.0 3.6-3.8 CCG 7.3.1 Bazel 3.1.0 8.0 11.0
tensorflow-2.3.0 3.5-3.8 CCG 7.3.1 Bazel 3.1.0 7.6 10.1
tensorflow-2.2.0 3.5-3.8 CCG 7.3.1 Bazel 2.0.0 7.6 10.1
tensorflow-2.1.0 2,7, 3,5-3,7 CCG 7.3.1 Bazel 0.27.1 7.6 10.1
tensorflow-2.0.0 2.7, 3.3-3.7 CCG 7.3.1 Bazel 0.26.1 7.4 10.0
tensorflow_gpu-1.15.0 2.7, 3.3-3.7 CCG 7.3.1 Bazel 0.26.1 7.4 10.0
tensorflow_gpu-1.14.0 2.7, 3.3-3.7 CCG 4.8 Bazel 0.24.1 7.4 10.0
tensorflow_gpu-1.13.1 2.7, 3.3-3.7 CCG 4.8 Bazel 0.19.2 7.4 10.0
tensorflow_gpu-1.12.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.15.0 7 9
tensorflow_gpu-1.11.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.15.0 7 9
tensorflow_gpu-1.10.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.15.0 7 9
tensorflow_gpu-1.9.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.11.0 7 9
tensorflow_gpu-1.8.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.10.0 7 9
tensorflow_gpu-1.7.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.9.0 7 9
tensorflow_gpu-1.6.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.9.0 7 9
tensorflow_gpu-1.5.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.8.0 7 9
tensorflow_gpu-1.4.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.5.4 6 8
tensorflow_gpu-1.3.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.4.5 6 8
tensorflow_gpu-1.2.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.4.5 5.1 8
tensorflow_gpu-1.1.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.4.2 5.1 8
tensorflow_gpu-1.0.0 2.7, 3.3-3.6 CCG 4.8 Bazel 0.4.2 5.1 8

macos

UPC

Versión Versión de Python Compilador herramientas de construcción
tensorflow-2.16.1 3.9-3.12 Sonido metálico de Xcode 13.6 Bazel 6.5.0
tensorflow-2.15.0 3.9-3.11 Sonido metálico de xcode 10.15 Bazel 6.1.0
tensorflow-2.14.0 3.9-3.11 Sonido metálico de xcode 10.15 Bazel 6.1.0
tensorflow-2.13.0 3.8-3.11 Sonido metálico de xcode 10.15 Bazel 5.3.0
tensorflow-2.12.0 3.8-3.11 Sonido metálico de xcode 10.15 Bazel 5.3.0
tensorflow-2.11.0 3.7-3.10 Sonido metálico de xcode 10.14 Bazel 5.3.0
tensorflow-2.10.0 3.7-3.10 Sonido metálico de xcode 10.14 Bazel 5.1.1
tensorflow-2.9.0 3.7-3.10 Sonido metálico de xcode 10.14 Bazel 5.0.0
tensorflow-2.8.0 3.7-3.10 Sonido metálico de xcode 10.14 Bazel 4.2.1
tensorflow-2.7.0 3.7-3.9 Sonido metálico de xcode 10.11 Bazel 3.7.2
tensorflow-2.6.0 3.6-3.9 Sonido metálico de xcode 10.11 Bazel 3.7.2
tensorflow-2.5.0 3.6-3.9 Sonido metálico de xcode 10.11 Bazel 3.7.2
tensorflow-2.4.0 3.6-3.8 Sonido metálico de xcode 10.3 Bazel 3.1.0
tensorflow-2.3.0 3.5-3.8 Sonido metálico de xcode 10.1 Bazel 3.1.0
tensorflow-2.2.0 3.5-3.8 Sonido metálico de xcode 10.1 Bazel 2.0.0
tensorflow-2.1.0 2,7, 3,5-3,7 Sonido metálico de xcode 10.1 Bazel 0.27.1
tensorflow-2.0.0 2,7, 3,5-3,7 Sonido metálico de xcode 10.1 Bazel 0.27.1
tensorflow-2.0.0 2.7, 3.3-3.7 Sonido metálico de xcode 10.1 Bazel 0.26.1
tensorflow-1.15.0 2.7, 3.3-3.7 Sonido metálico de xcode 10.1 Bazel 0.26.1
tensorflow-1.14.0 2.7, 3.3-3.7 Sonido metálico de xcode Bazel 0.24.1
tensorflow-1.13.1 2.7, 3.3-3.7 Sonido metálico de xcode Bazel 0.19.2
tensorflow-1.12.0 2.7, 3.3-3.6 Sonido metálico de xcode Bazel 0.15.0
tensorflow-1.11.0 2.7, 3.3-3.6 Sonido metálico de xcode Bazel 0.15.0
tensorflow-1.10.0 2.7, 3.3-3.6 Sonido metálico de xcode Bazel 0.15.0
tensorflow-1.9.0 2.7, 3.3-3.6 Sonido metálico de xcode Bazel 0.11.0
tensorflow-1.8.0 2.7, 3.3-3.6 Sonido metálico de xcode Bazel 0.10.1
tensorflow-1.7.0 2.7, 3.3-3.6 Sonido metálico de xcode Bazel 0.10.1
tensorflow-1.6.0 2.7, 3.3-3.6 Sonido metálico de xcode Bazel 0.8.1
tensorflow-1.5.0 2.7, 3.3-3.6 Sonido metálico de xcode Bazel 0.8.1
tensorflow-1.4.0 2.7, 3.3-3.6 Sonido metálico de xcode Bazel 0.5.4
tensorflow-1.3.0 2.7, 3.3-3.6 Sonido metálico de xcode Bazel 0.4.5
tensorflow-1.2.0 2.7, 3.3-3.6 Sonido metálico de xcode Bazel 0.4.5
tensorflow-1.1.0 2.7, 3.3-3.6 Sonido metálico de xcode Bazel 0.4.2
tensorflow-1.0.0 2.7, 3.3-3.6 Sonido metálico de xcode Bazel 0.4.2

GPU

Versión Versión de Python Compilador herramientas de construcción cuDNN CUDA
tensorflow_gpu-1.1.0 2.7, 3.3-3.6 Sonido metálico de xcode Bazel 0.4.2 5.1 8
tensorflow_gpu-1.0.0 2.7, 3.3-3.6 Sonido metálico de xcode Bazel 0.4.2 5.1 8