• Tutoriais Alunos

FPGA na AWS

  • Aluno: Martim Ferreira José
  • Curso: Engenharia da Computação
  • Semestre: 9
  • Contato:
  • Link tutorial oficial:
  • Ano: 2019

Hardware utilizado no tutorial

  • Instância F1 na AWS

Introdução

A AWS dispõem de instâncias F1, que são máquinas de alta performance que contém uma FPGA no barramento PCI, permitindo a execução de programas acelerados por meio de hardware personalizado. Para executar um programa em uma FPGA na nuvem, é preciso primeiro desenvolver, simular, depurar e compilar o código. Tudo isso é feito em uma instância de desenvolvimento, predefinida por uma AMI (Amazon Machine Image) fornecida pela AWS. Na instância de desenvolvedor, o programa é compilado e é gerada uma imagem para a FPGA Xilinx presente na instância F1.

O programa a ser implementado na FPGA pode ser desenvolvido utilizando três ambientes de desenvolvimento diferentes, documentados a seguir:

Development Environment Description Accelerator Language
Software Defined Accelerator Development - SDAccel Development experience leverages an optimized compiler to allow easy new accelerator development or migration of existing C/C++/openCL, Verilog/VHDL to AWS FPGA instances C/C++/OpenCL, Verilog/VHDL (RTL)
Hardware Accelerator Development - HDK Fully custom hardware development experience provides hardware developers with the tools required for developing AFIs for AWS FPGA instances Verilog/VHDL
IP Integrator or High Level Synthesis (HLx) Graphical interface development experience for integrating IP and high level synthesis development Verilog/VHDL/C

Pela facilidade e maior conhecimento de C++, opta-se pela escolha do ambiente SDAccel. Portando, o programa a ser implementado é programado em sua maioria em C++ utilizando a arquitetura OpenCL, que é amplamente utilizada na programação de alto desempenho em diversas plataformas.

Este tutorial faz a implementação do exemplo Hello World, que consiste na adição de dois vetores. O código deste exemplo pode ser examinado a fundo no seguinte repositório: https://github.com/Xilinx/SDAccel_Examples/tree/a41b58921188ad90ace2d34a22a2513d8f74b549/getting_started/host/helloworld_ocl

No repositório há dois arquivos na pasta src: host.cpp e vector_addition.cl, que correspondem ao programa da máquina e ao kernel da FPGA, respectivamente.

O arquivo host consiste em um programa C++ em que:

  • São definidos três vetores: A, B e results.
  • A placa Xilinx é selecionada e adicionada para o contexto da execução.
  • O binário do kernel é carregado e adicionado para um programa
  • Para migrar os dados entre host e device, são criados dois buffers de leitura referenciando A e B; E um buffer de escrita referenciando result.
  • Os dados armazenados nos buffers de leitura são transferidos da memória da máquina para memória da FPGA.
  • O kernel é extraído do programa, os argumentos são determinados (result, A, B, tamanho) e ele é lançado.
  • Os resultados são requisitados da FPGA e armazenados no buffer de escrita.
  • E por fim, o resultado recebido é comparados com o resultado esperado.

O arquivo do kernel consiste em uma função em OpenCL que:

  • Recebe quatro argumentos (result, A, B, tamanho)
  • Define os arrays A e B
  • Percorre os arrays recebidos como argumento, populando os arrays declarados
  • Percorre o tamanho das arrays escrevendo no buffer de escrita (result) a soma de A e B em cada índice.

Aplicações

As instâncias com FPGA são amplamente utilizadas em situações em que há uma grande quantidade de dados e o processamento precisa ser feito com rapidez. O desenvolvimento de um hardware personalizado para executar um programa fornece um custo de computação 30x melhor comparado com instâncias de CPU. Entre essas aplicações pode-se citar o encoding de video em tempo real e análise de risco financeiro.

Custos

A instância de desenvolvimento m5.xlarge custa US\(0.1920 por hora. E a instância f1.2xlarge custa US\)1.65 por hora. A implementação deste exemplo é estimada consumir por volta de 3hrs da instância de desenvolvimento e meia hora da instância F1. Totalizando US$1.5.

Passo a passo

Referências

Pré-requisitos

Pré-requisitos: Ter uma conta na AWS com acesso ao EC2 e S3.

Configurando a AWS

Em seu computador, baixe a CLI da AWS configure suas credenciais:

$ aws configure

Instância de desenvolvedor

Para criar a instância de desenvolvimento, clique em Launch Instance e: - Utilize a AMI chamada “FPGA Developer AMI”. - Utilize o flavor m5.xlarge ou m5.2xlarge (quanto mais núcleos e memória, mais rápido será a compilacão). - Crie e salve sua Keypair.

Bucket setup

Para utilizar a imagem compilada da F1, é necessário salvá-la em um bucket, permitindo o seu acesso pelo serviço EC2. O bucket e suas pastas podem ser criados manualmente pela dashboard ou pela CLI:

$ aws s3 mb s3://embarcados-f1-tutorial --region us-east-1
$ touch FILES_GO_HERE.txt 
$ aws s3 cp FILES_GO_HERE.txt s3://embarcados-f1-tutorial/files/
$ touch LOGS_FILES_GO_HERE.txt 
$ aws s3 cp LOGS_FILES_GO_HERE.txt s3://embarcados-f1-tutorial/logs/

Setting up the dev house

Acesse a instância de desenvolvimento:

ssh -i "<sua-keypair>.pem" <ip-da-máquina>

Dentro da instância, clone o repositório, instale os drivers e bibliotecas necessárias e determine a plataforma de desenvolvimento:

$ git clone https://github.com/aws/aws-fpga.git $AWS_FPGA_REPO_DIR
$ cd $AWS_FPGA_REPO_DIR
$ source sdaccel_setup.sh
$ export AWS_PLATFORM=$AWS_PLATFORM_DYNAMIC_5_0 

Acesse a pasta do exemplo no diretório:

$ cd $SDACCEL_DIR/examples/xilinx/getting_started/host/helloworld_ocl/

Hora de compilar? NÃO

Check up

A compilação do programa demora 2h06min. Já imaginou desenvolver algo e cada vez que quiser testar ter que esperar 2h? E por isso que existem o emulador de software, que realiza uma rápida compilação e executa nos ciclos da CPU. E o emulador de hardware, que invoca o simulador de hardware do ambiente SDAccel e testa a funcionalidade do código a ser executado na FPGA.

Para emular o software:

$ make clean
$ make check TARGETS=sw_emu DEVICES=$AWS_PLATFORM all

Para emular o hardware:

$ make clean
$ make check TARGETS=hw_emu DEVICES=$AWS_PLATFORM all 

Compilando!

O ambiente SDAccel também permite que o desenvolvedor compile tanto o binário da placa FPGA, quanto a aplicação host. Isso é feito por meio do mesmo Makefile:

$ make clean
$ make TARGETS=hw DEVICES=$AWS_PLATFORM all 

A compilação gera o arquivo binário para a FPGA Xilinx (*.xclbin) e o executável do programa host (exe), no nosso caso: helloworld.

Criação da Amazon FPGA Image (AFI)

Agora, é preciso gerar uma imagem FPGA que será inserida na placa presente na PCI da instância. O script abaixo salva o kernel da FPGA no bucket, cria a AMI no servidor da AWS e salva um arquivo de metadados com informações da imagem (*.awsxclbin), que também pode ser vistas no arquivo *_afi_id.txt.

$ $SDACCEL_DIR/tools/create_sdaccel_afi.sh -xclbin= xclbin/vector_addition.hw.xilinx_aws-vu9p-f1-04261818_dynamic_5_0.xclbin -o=vector_addition.hw.xilinx_aws-vu9p-f1-04261818_dynamic_5_0 \ -s3_bucket=embarcados-f1-tutorial -s3_dcp_key=files -s3_logs_key=logs

A criação da imagem não é imediata, seu processo demora e pode ser acompanhado pela CLI da AWS:

aws ec2 describe-fpga-images --fpga-image-ids <AFI ID (eg: afi-06d0ffc989feeea2a)>

Quando a criação da imagem for concluída, o output deverá ser:

                ...
                "State": {
                    "Code": "available"
                },
                ...

Caso o código do status retorne como "failed", procure os logs em: s3://embarcados-f1-tutorial/logs/

Exportando o programa

Os arquivos necessários para executar o exemplo na FPGA são:

  • <nome-do-arquivo>.awsxclbin
  • helloworld

Portanto, copie-os para o bucket:

$ aws s3 cp <nome-do-arquivo>.awsxclbin s3://embarcados-f1-tutorial/files/
$ aws s3 cp helloworld s3://embarcados-f1-tutorial/files/

Criando a instância F1

Para criar a instância F1, clique em Launch Instance e:

  • Utilize a AMI chamada “FPGA Developer AMI”.
  • Utilize o flavor f1.2xlarge.
  • Crie e salve sua Keypair.

Executando

  • Acesse a instância F1
  • Repita o passo Setting up the dev house
  • Acesse o diretório do repositório cd $AWS_FPGA_REPO_DIR
  • Copie os arquivos salvos no bucket:
$ aws s3 cp s3://embarcados-f1-tutorial/files/<nome-do-arquivo>.awsxclbin ./
$ aws s3 cp s3://embarcados-f1-tutorial/files/helloworld ./
  • Certifique-se que todos os arquivos possam ser achados na raiz do respositório
  • $ sudo -E /bin/bash
  • $ source $AWS_FPGA_REPO_DIR/sdaccel_runtime_setup.sh
  • chmod +x helloworld
  • ./helloworld

Pronto! O programa host importou a imagem da FPGA do serviço AMI da AWS, criou os buffers para fazer a transferência de dados, determinou os argumentos e inseriu todo o kernel na placa.

Notes

Adicionar log do resultado