Ejemplo de backend de HLS

Se puede acceder a más documentos chinos de TVM → Apache TVM es un marco de compilación de aprendizaje profundo de un extremo a otro, adecuado para CPU, GPU y varios chips de aceleración de aprendizaje automático. | Sitio chino Apache TVM


TVM admite placas Xilinx FPGA con SDAccel, luego cómo implementar TVM en la instancia AWS F1 FPGA.

Nota: Esta función aún está en versión beta; actualmente no es posible implementar una red neuronal de un extremo a otro con SDAccel.
Este tutorial utiliza dos scripts de Python:

  • build.py: script para sintetizar el flujo de bits de FPGA.
import tvm
 from tvm import te
 
 tgt= tvm.target.Target("sdaccel", host="llvm")
 
 n = te.var("n")
 A = te.placeholder((n,), name='A')
 B = te.placeholder((n,), name='B')
 C = te.compute(A.shape, lambda i: A[i] + B[i], name="C")
 
 s = te.create_schedule(C.op)
 px, x = s[C].split(C.op.axis[0], nparts=1)
 
 s[C].bind(px, tvm.te.thread_axis("pipeline"))
 
 fadd = tvm.build(s, [A, B, C], tgt, name="myadd")
 fadd.save("myadd.o")
 fadd.imported_modules[0].save("myadd.xclbin")
 
 tvm.contrib.cc.create_shared("myadd.so", ["myadd.o"])
  • run.py: script para utilizar FPGA como acelerador.
import tvm
 import numpy as np
 import os
 
 tgt = "sdaccel"
 
 fadd = tvm.runtime.load_module("myadd.so")
 if os.environ.get("XCL_EMULATION_MODE"):
 fadd_dev = tvm.runtime.load_module("myadd.xclbin")
 else:
 fadd_dev = tvm.runtime.load_module("myadd.awsxclbin")
 fadd.import_module(fadd_dev)
 
 dev = tvm.device(tgt, 0)
 
 n = 1024
 a = tvm.nd.array(np.random.uniform(size=n).astype("float32"), dev)
 b = tvm.nd.array(np.random.uniform(size=n).astype("float32"), dev)
 c = tvm.nd.array(np.zeros(n, dtype="float32"), dev)
 
 fadd(a, b, c)
 tvm.testing.assert_allclose(c.numpy(), a.numpy() + b.numpy())

configuración

  • Inicie la instancia con la AMI de desarrollador de FPGA. Las instancias F1 no son necesarias para la simulación y la síntesis, por lo que se recomiendan instancias con menores gastos generales.
  • Configure el kit de desarrollo de AWS FPGA:
git clone https://github.com/aws/aws-fpga.git
 cd aws-fpga
 source sdaccel_setup.sh
 source ${XILINX_SDX}/settings64.sh
  • Configure TVM antes de habilitar OpenCL.

Simulación​

  • Cree emconfig.json para simulación:
emconfigutil --platform ${AWS_PLATFORM} --nd 1
  • Copie emconfig.json al directorio binario de Python: porque el kit de herramientas Xilinx actual supone que el archivo binario del host y el archivo emconfig.json están en la misma ruta.
cp emconfig.json $(dirname $(which python))
  • Ejecute la simulación del software:
export XCL_EMULATION_MODE=1
 export XCL_TARGET=sw_emu
 
 python build.py
 python run.py
  • Ejecute la emulación de hardware:
export XCL_EMULATION_MODE=1
 export XCL_TARGET=hw_emu
 
 python build.py
 python run.py

síntesis

  • Redacte con el siguiente script:
unset XCL_EMULATION_MODE
 export XCL_TARGET=hw
 
 python build.py
  • Cree una imagen de AWS FPGA y cárguela en AWS S3:
${SDACCEL_DIR}/tools/create_sdaccel_afi.sh \
 -xclbin=myadd.xclbin -o=myadd \
 -s3_bucket=<bucket-name> -s3_dcp_key=<dcp-folder-name> \
 -s3_logs_key=<logs-folder-name>

Esto genera el archivo awsxclbin (necesario para utilizar la imagen AWS FPGA en una instancia F1).

correr

  • Inicie una instancia Amazon EC2 F1.
  • Copie myadd.so, myadd.awsxclbin y run.py en la instancia F1.
  • Configure el kit de desarrollo de AWS FPGA:
git clone https://github.com/aws/aws-fpga.git
 cd aws-fpga
 source sdaccel_setup.sh
  • Configure TVM antes de habilitar OpenCL.
  • Establezca las variables de entorno como raíz:
sudo sh
 source ${INSTALL_ROOT}/setup.sh
  • correr:
python run.py

Supongo que te gusta

Origin blog.csdn.net/HyperAI/article/details/132543156
Recomendado
Clasificación