内存计算处理器:机器学习的高效加速方案

需积分: 5 0 下载量 59 浏览量 更新于2024-06-26 收藏 32.65MB PDF 举报
"本次会议主要探讨了在机器学习领域中,如何通过高效的计算内存(Compute-In-Memory, CIM)基处理器来提升性能。论文涵盖了两个关键主题:16.1 MulTCIM 和 16.2 飞腾蝴蝶零跳过器。 16.1 MulTCIM(多模态变压器 CIM 加速器) 由清华大学提出的 MulTCIM 是一个基于 28nm 工艺的 14.36mm² 数字 CIM 设备,设计用于加速多模态变换器。这个加速器利用注意力令牌位混合稀疏性来提高效率,特别关注于注意力令牌消除和令牌修剪与对称模态重叠。通过引入位平衡的 CIM 方法,它提升了 CIM 的利用率并减少了延迟。对于 ViLBERT 基础模型,在 INT8/INT16 混合精度下,MulTCIM 在 0.7V 电压和 160MHz 频率下每个令牌的功耗仅为 2.24μJ。 16.2 飞腾蝴蝶零跳过器(28nm 53.8 TOPS/W 8b 稀疏变压器加速器) 复旦大学、Birentech 和鹏城实验室联合展示了另一个 28nm 3.93mm² CIM 基稀疏变压器加速器。这个加速器的核心特点是内置的内存蝴蝶零跳过器,专为无结构剪枝的神经网络以及 CIM 基本地注意力可重用引擎设计。通过这种创新技术,该加速器在能效上实现了显著提升,达到了 53.8 TOPS/W(每瓦特万亿次操作)。" 这两篇论文共同展示了 CIM 技术在机器学习处理器中的应用,特别是在加速Transformer模型的计算过程中。MulTCIM 和飞腾蝴蝶零跳过器都利用了稀疏性来优化性能,减少计算需求,并提高能效。这些方法对于处理大规模的自然语言处理任务(如多模态变换器)至关重要,因为这些任务通常需要大量的计算资源。通过将计算过程移至内存内部,这些设计减少了数据在内存和处理器之间传输的时间,从而降低了延迟并提高了整体系统性能。此外,采用混合精度计算进一步节省了能量,使得这些设备更适合于能源受限的环境,如边缘计算或物联网设备。这些研究为构建更高效、更节能的机器学习硬件平台提供了新的思路。

import time import multiprocessing from proxypool.processors.server import app from proxypool.processors.getter import Getter from proxypool.processors.tester import Tester from proxypool.setting import CYCLE_GETTER, CYCLE_TESTER, API_HOST, API_THREADED, API_PORT, ENABLE_SERVER, \ ENABLE_GETTER, ENABLE_TESTER, IS_WINDOWS from loguru import logger if IS_WINDOWS: multiprocessing.freeze_support() tester_process, getter_process, server_process = None, None, None class Scheduler(): def run_tester(self, cycle=CYCLE_TESTER): if not ENABLE_TESTER: logger.info('tester not enabled, exit') return tester = Tester() loop = 0 while True: logger.debug(f'tester loop {loop} start...') tester.run() loop += 1 time.sleep(cycle) # CYCLE_GETTER=100 def run_getter(self, cycle=CYCLE_GETTER): if not ENABLE_GETTER: logger.info('getter not enabled, exit') return getter = Getter() loop = 0 while True: logger.debug(f'getter loop {loop} start...') getter.run() loop += 1 time.sleep(cycle) def run_server(self): if not ENABLE_SERVER: logger.info('server not enabled, exit') return app.run(host=API_HOST, port=API_PORT, threaded=API_THREADED) def run(self): global tester_process, getter_process, server_process try: logger.info('starting proxypool...') if ENABLE_TESTER: tester_process = multiprocessing.Process(target=self.run_tester) logger.info(f'starting tester, pid {tester_process.pid}...') tester_process.start() if ENABLE_GETTER: getter_process = multiprocessing.Process(target=self.run_getter) logger.info(f'starting getter, pid{getter_process.pid}...') getter_process.start() if ENABLE_SERVER: server_process = multiprocessing.Process(target=self.run_server) logger.info(f'starting server, pid{server_process.pid}...') server_process.start() tester_process.join() getter_process.join() server_process.join() except KeyboardInterrupt: logger.info('received keyboard interrupt signal') tester_process.terminate() getter_process.terminate() server_process.terminate() finally: # must call join method before calling is_alive tester_process.join() getter_process.join() server_process.join() logger.info(f'tester is {"alive" if tester_process.is_alive() else "dead"}') logger.info(f'getter is {"alive" if getter_process.is_alive() else "dead"}') logger.info(f'server is {"alive" if server_process.is_alive() else "dead"}') logger.info('proxy terminated') if name == 'main': scheduler = Scheduler() scheduler.run()给这段代码加注释

2023-06-09 上传