Configurando Conda e PyTorch em um servidor IBM Power9
Contexto
Este é o segundo post de uma série de tutoriais que vamos mostrar o passo-a-passo de como construir uma API de Modelos de Linguagem em um servidor Power9, desde da configuração do Sistema Operacional, até a API executando inferências de forma remota. O primeiro post mostra como instalar o S.O e configurar drivers NVIDIA, CUDA e CUDNN. Nesta etapa do tutorial vamos mostrar a configuração do gerenciador de pacotes Conda e da biblioteca PyTorch
Conda: Conda é um sistema de gerenciamento de pacotes e ambientes de código aberto e multiplataforma. Ele funciona como uma “caixa de ferramentas” para cientistas de dados e desenvolvedores, ajudando a organizar seus projetos.
PyTorch: PyTorch é uma biblioteca de código aberto para aprendizado de máquina, desenvolvida principalmente pelo Facebook AI Research (FAIR). Ela é especialmente popular para o desenvolvimento de aplicações de deep learning (aprendizado profundo), um subcampo do aprendizado de máquina que se inspira no funcionamento do cérebro humano.
TL;DR
- Este post apresenta o passo-a-passo para a instalação do Conda e PyTorch.
- O desafio maior é encontrar versões compatíveis com a arquitetura das máquinas Power.
Configurando Conda
Vamos começar com a instalação do Conda. Em sistemas Power, a arquitetura usada é a ppc64le (PowerPC 64 bits little-endian), por isso é essencial que a versão baixada seja para esta arquitetura. Para isso, vamos utilizar o miniconda, uma versão mais leve e direta para setups customizados como o servidor Power9.
- Para baixar e instalar a versão mais atualizada do miniconda:
sudo wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-ppc64le.sh
bash ~/Miniconda3-latest-Linux-ppc64le.sh
- Verifique se a instalação ativou o conda automático:
conda -–version
Caso não tenha iniciado automaticamente, o Conda precisa ser ativado.
- Para não precisar ativar sempre que realizar uma nova conexão, vamos escrever o comando no bashrc (ou zshrc):
echo 'source ~/miniconda3/etc/profile.d/conda.sh' >> ~/.bashrc
source ~/.bashrc
Verifique novamente com o comando:
conda --version
A saída esperada é algo semelhante a: conda 23.10.0
Instalando e configurando a biblioteca PyTorch
Não existem builds oficiais ou wheels Conda/PyPi com suporte completo para a arquitetura ppc64le, sendo assim, para instalar o PyTorch precisamos buildar manualmente.
(Opcional) Criação de ambiente virtual Conda
Para iniciarmos a instalação é aconselhável criar um ambiente virtual para instalar o pytorch apenas nele.
- Para criar e ativar o ambiente virtual executamos os comandos:
conda create -y -n api_llm python=3.10
conda activate api_llm
Instalando pré-requisitos
Precisamos instalar alguns pacotes necessários para realizar o build do PyTorch da forma correta.
- Inicialmente, vamos instalar os pacotes com os seguintes comandos:
conda install -y -c conda-forge openblas libblas cmake ninja python3-devel gcc-c++ rust cargo
O CMake (sistema de build utilizado pelo PyTorch) removeu o suporte a scripts que declaram compatibilidade com versões antigas (<3.5). Para resolver isso, precisamos instalar via pip uma versão do cmake <3.5.
- Executamos o comando:
pip install cmake==3.27.7
Para garantir que a versão correta foi instalada, executamos o comando:
cmake --version
A saída esperada é: cmake version 3.27.7
Build do Pytorch
Agora vamos iniciar o processo de build do PyTorch.
- O primeiro passo é clonar o repositório e configurar para instalar a versão 2.6.0:
git clone --recursive https://github.com/pytorch/pytorch
cd pytorch
git checkout v2.6.0
git submodule sync
git submodule update --init --recursive
- Para instalar os pacotes necessários via pip executamos o seguinte comando:
pip install -r requirements.txt
- E, finalmente, para realizar o build do PyTorch, executamos o setup.py do python:
sudo USE_CUDA=1 USE_DISTRIBUTED=1 USE_NCCL=1 USE_GLOO=1 USE_CUDNN=1 python setup.py install
O processo de build geralmente demora um tempo considerável, cerca de 15 minutos.
- Para testar se tudo ocorreu certo, vamos criar um arquivo chamado
test_torch.py
nano test_torch.py
Esse arquivo deve conter as seguintes linhas:
1import torch
2print(torch.__version__)
3print("CUDA disponível:", torch.cuda.is_available())
4print("Número de GPUs:", torch.cuda.device_count())
5print("Nome da GPU:", torch.cuda.get_device_name(0))
6x = torch.rand(3, 3).cuda()
7y = torch.rand(3, 3).cuda()
8print("Soma na GPU:", (x + y))
9print("cuDNN disponível:", torch.backends.cudnn.is_available())
10print("Extensões C carregadas:", torch._C._cuda_getDeviceCount() > 0)
Ao executar esse arquivo, saberemos:
- Versão instalada do pytorch
- Disponibilidade do CUDA
- Quantidade de GPUs disponíveis
- Nome da GPU no servidor Power9
- Se a utilização da GPU está acontecendo de forma correta
- Disponibilidade do CUDNN
- Se os arquivos .so foram compilados corretamentes
Esse arquivo apenas checa algumas informações do CUDA e PyTorch e executa uma operação de soma utilizando tensores em GPU.
- Vamos executar o arquivo com o comando:
python test_gpu.py
A saída deve ser algo semelhante a:
2.6.0a0+git1eba9b3
CUDA disponível: True
Número de GPUs: 4
Nome da GPU: Tesla V100-SXM2-16GB
Soma na GPU: tensor([[1.9163, 1.2208, 0.5998],
[1.7962, 0.6040, 1.3943],
[0.9536, 0.8010, 0.0668]], device='cuda:0')
cuDNN disponível: True
Extensões C carregadas: True
É importante lembrar que as saídas podem ser diferentes em relação ao número e modelo das GPUs e a soma de tensores (devido a aleatoriedade). É importante que as saídas booleanas do código que executamos tenham resultados igual a True.
Com isso, a biblioteca PyTorch está instalada e configurada para ser utilizada. No próximo tutorial vamos realizar a primeira inferência de um Modelo de Linguagem no servidor Power9.
