• [计算类] trans_cast算子转换失败
    系统为ubuntu18.04.6 arm架构、版卡为atlas200,芯片为310,cann版本已升级为最新版本6.0.1、驱动为21.0.2,RC模式npu-smi infopytorch的模型转onnx,用atc工具将onnx转成om模型,atc --model=./model.onnx --framework=5 --output=./model --soc_version=Ascend310报错trans_cast算子转换失败,如下:​​​​​​​
  • 苹果弃车计划,雷军震惊!人工智能与物联网科技:谁才是汽车技术对决的关键?
    近日,科技界爆出重磅新闻,苹果公司历经十年磨砺、投入10亿多资金的电动汽车项目最终宣告终止。消息一出小米创始人雷军直言表示非常震惊。而理想汽车创始人李想则敏锐地指出,汽车行业的电动化转型仅仅是“上半场”,真正的决战在于人工智能的应用与发展。苹果造车计划的转折点苹果公司在其“泰坦”项目中倾注了大量资源和精力,致力于打造一款集创新设计、自动驾驶技术于一体的高端电动汽车。然而,在经历了一系列战略调整和技术挑战后,苹果选择将部分团队转向AI领域的深耕,预示着公司将重心转移到了智能驾驶及车载软件系统的开发上。智能汽车:从电动化到智能化李想的观点精准揭示了汽车产业演进的新趋势——电动化仅是汽车业变革的初级阶段,即所谓的“上半场”。随着电池技术的突破、充电设施的普及和完善,电动车已逐渐成为主流发展趋势。然而,真正定义未来汽车行业竞争力的将是汽车的智能化程度,即通过物联网、大数据、人工智能等前沿技术实现车辆的高度自主驾驶、人车交互优化以及车辆间协同能力的提升。物联网技术的核心在于实现设备的互联互通,对于汽车行业而言,这意味着车辆不再仅仅是一个交通工具,而是成为一个能够收集数据、分析信息并与外界智能互动的平台。从智能导航到自动驾驶,从车辆状态监控到远程控制,盈电科技物联网的应用正在逐步改变我们对汽车的认知和使用方式。智能驾驶体验:通过车联网技术,汽车能够实时接收交通信息,预警危险情况,提供最优路线建议,并根据驾驶者行为自动调整车内环境(如灯光、音乐等),提升驾驶体验。预防性维护:利用传感器收集的数据分析汽车各部件的使用状况,预测潜在故障,提前提醒车主进行保养或维修,降低突发故障的风险。车辆安全系统:物联网技术可以增强车辆的防盗、防碰撞和紧急救援功能。例如,在发生碰撞时自动联系紧急服务,或者在车辆被盗时追踪其位置。能效管理:通过分析行驶数据和环境信息,优化动力系统的工作模式,提高燃油效率或电能利用效率,减少能源消耗。互联共享:汽车成为移动的数据中心,与家庭、城市基础设施等其他设备互联,实现资源共享,比如在回家途中控制家中的温度、照明等。然而,物联网在汽车行业的应用也面临着挑战。数据安全和隐私保护是物联网普遍存在的问题,同时,智能化程度的提高也需要相应的法律法规来规范。除此以外,技术的普及和成本的降低也是推动物联网在汽车行业广泛应用的关键因素。尽管苹果的电动汽车计划暂时搁浅,但这并不意味着汽车行业的智能化发展会停滞不前。相反,随着物联网技术的不断成熟和人工智能的深入应用,汽车行业将迎来更加智能、互联的新时代。未来的汽车将不仅仅是一种出行工具,更将成为人们生活中不可或缺的智能伙伴。
  • [技术干货] 人脸识别知多少?【转】
    Part 01 脸识别技术概述人脸识别技术属于生物特征识别技术,是一种依据人人脸的若干特征(如眼睛、鼻子、嘴巴、眉毛等)自动进行身份识别的技术,又被称为面像识别、人像识别、相貌识别、面孔识别、面部识别等。其主要利用摄像机或摄像头采集含有人脸的图像或视频流,通过人脸检测技术分析其是否存在人脸,存在则给出人脸所在位置、大小和面部关键器官的位置信息;再根据这些信息提取所蕴涵的身份特征,并将其与已知的人脸特征进行对比,从而识别每个人脸的身份。 Part 02 人脸检测人脸检测是人脸识别和人脸分析系统的关键第一步,主要用于解决“人脸在哪里”的问题,在图像中准确标定出人脸的位置和大小,并提供给后续的人脸特征分析和识别。早期的人脸检测工作主要基于人工精心设计的局部描述子进行特征提取,主要可分为4类基于知识的人脸检测方法、基于模型的人脸检测方法、基于特征的人脸检测方法、基于外观的人脸检测方法,其中比较比较经典的作品有haar cascades分类器、HOG(Histogram of Oriented Gridients)特征检测算法。但传统的检测对于多种变异因素的具有挑战性的图像,人脸检测精度有限。 随着深度学习的蓬勃发展,逐渐演变出许多基于不同深度学习架构的人脸检测方法,主要有基于级联cnn模型、基于R-CNN模型、单发探测器模型、基于特征金字塔网络模型、基于变形金刚模型等,极大的改善了传统人脸检测、识别在特征提取、精确度、可扩展性方面均有诸多不足。MTCNN是其中一个比较优秀的人脸检测模型,该模型通过三个阶段的深度卷积网络,以粗到细的方式预测人脸和地标位置,具体步骤为:第一阶段:通过浅层CNN快速生成候选窗口;第二阶段:通过更复杂的CNN拒绝大量非面部窗口来细化窗口;第三阶段:使用更强大的CNN再次细化结果并输出五个面部标志位置。Part 03 人脸特征人脸特征也称人脸表征,是人脸的某些特征,比如脸的长度、脸的宽度、唇部宽度、鼻子长度等,人脸特征提取就是对人脸进行特征建模得到向量化人脸特征的过程。人脸特征提取按照技术特点大致可分为三类:基于全局信息的Holistic方法、基于局部信息的Local特征方法、基于深度学习的方法。基于深度学习的人脸特征可以从数据集中自动学习特征,如果数据集能够覆盖足够的鲁棒性数据(如光照、姿态、表情等),则算法能适应各种挑战,也是当前的主流人脸特征提取方法。 Part 04 人脸识别人脸识别是人脸比对的过程,通过比对提取的人脸特征获两个人脸的相似度,判断方法为比较两个特征间的欧式距离(L2距离)或者余弦距离(cosine距离):L2距离越小,相似度越高;cos距离夹角越小,cos距离越大相似度越高。根据比对的数量不同,又可分为1:1和1:N。1:1最常见的场景就是人证比对,比如我们在乘高铁时所遇到的这种设备。1:N是1张人脸和底库中的N张人脸进行比对,比如在考勤机中,我们的人脸底库中包含全公司的所有人脸照片。转载自:cid:link_0
  • [技术干货] 实时“人脸”模糊!实战教程【转】
    大家好,今天跟大家分享一个实战的教程。老规矩,先看效果(明确一下目标): 随着人脸识别技术的发展,给我们的日常生活带来了许多的便利,但是同样的也存在隐私的问题。以及可能被不法分子用于做一些违法事情。所以很多视频博主,都会给路人打码。但是手动打码是一件非常繁琐的事情,对于单帧图片还算简单,但是假设视频的帧率是 25FPS,即一秒中有25帧图片,那么一个几分钟的视频,其工作量也非常的可怕。因此我们尝试使用程序自动去执行这样子的操作!我们可以使用Opencv、Mediapipe和Python,实现实时模糊人脸。我们可以分两步完成:在打码之前,首先确定人脸位置取出脸,模糊它,然后将处理后的人脸放回到视频帧中(视频处理类似)1、在打码之前,首先确定人脸位置首先配置一下环境,安装必要的库(OpenCV 和 MediaPipe)pip install opencv-python pip install mediapipe在 MediaPipe 库中提供了人脸关键点检测的模块。详细的内容可以参考:cid:link_0当然在该项目的代码中,也提供人脸关键点检测的代码。“facial_landmarks.py”的文件: 下面我们就一起来写一下这部分的代码:首先导入必要的库以及用于人脸关键点检测的模块:import cv2 import mediapipe as mp import numpy as np from facial_landmarks import FaceLandmarks # Load face landmarks fl = FaceLandmarks()然后使用检测出来的人脸关键点最外围的一圈关键点绘制一个多边形(脸部轮廓)。这里使用opencv 中的convxhull() 函数可以实现:# 1. Face landmarks detection landmarks = fl.get_facial_landmarks(frame) convexhull = cv2.convexHull(landmarks)绘制完成后的结果如下所示: 之后使用上面所提取到的人脸关键点坐标创建mask,用提取我们在视频帧中感兴趣的区域: # 2. Face blurrying mask = np.zeros((height, width), np.uint8) # cv2.polylines(mask, [convexhull], True, 255, 3) cv2.fillConvexPoly(mask, convexhull, 255)结果如下所示: 得到这个mask,我们就可以进一步对人脸进行模糊(打码)处理。 打码的操作,这里使用的是OpenCV 中的cv2.blur() 函数:# Extract the face frame_copy = cv2.blur(frame_copy, (27, 27)) face_extracted = cv2.bitwise_and(frame_copy, frame_copy, mask=mask)结果: 目前,我们已经实现对人脸进行打码操作,剩下的就是对人脸以外的区域进行提取,并合并成最终的结果即可! 对人脸以外的区域进行提取(背景),实际上对上面的mask 进行取反即可。 背景提取:# Extract background background_mask = cv2.bitwise_not(mask) background = cv2.bitwise_and(frame, frame, mask=background_mask)从图像的细节可以看出,背景是完全可见的,但面部区域已经变成黑色了。这是我们将在下一步中应用模糊人脸的空白区域。 最后一步,将上面两步获取的人脸mask 和背景进行相加即可,这里使用cv2.add() 即可实现我们的目标: # Final result result = cv2.add(background, face_extracted)结果: 这是对一帧图片进行处理。2、取出脸,模糊它,然后将处理后的人脸放回到视频帧中上面的操作都是在单帧图片上进行处理的,如果我们需要出来的是视频的话,其实原理是完全一样的,只不过是将一个视频拆成一系列的图片即可。稍微做一些修改:(1)输入文件 (图片 ---> 视频)cap = cv2.VideoCapture("person_walking.mp4")(2)对输入的视频帧,做一个循环遍历:while True: ret, frame = cap.read() frame = cv2.resize(frame, None, fx=0.5, fy=0.5) frame_copy = frame.copy() height, width, _ = frame.shape ...转载自:cid:link_1
  • [技术干货] 边缘人工智能:让智能更接近源头【转】
    随着人工智能的发展,不是把数据交给算法,而是算法去处理数据,从而实现一个全新的洞察力水平。 如今,人工智能 (AI) 无处不在,使组织能够预测系统中断的可能性,推动自动驾驶汽车,并为聊天机器人或虚拟助手提供语言功能。 这些类型的人工智能用例主要依赖于集中式、基于云的人工智能,其中存储着大量的训练数据集。 然而,人们越来越倾向于让人工智能更接近源头或更接近边缘。 边缘计算在世界范围内部署了一系列网络和设备,并且数据在更接近数据生成的地方进行处理,在人工智能的支持下变得可操作。由于物联网 (IoT) 积累的海量数据,从源头就非常需要这种类型的智能。 物联网设备(例如传感器、设备或可穿戴设备)通过互联网收集和交换数据,并且通常嵌入到其他物联网设备中以提供通信网络。 例如,仓库员工佩戴的物联网设备可以在跌倒时通知管理层,并向 911 发出警报。冰箱上的物联网设备可以在牛奶不足时提醒房主,或者在搅拌器需要维护时向生物技术科学家发出信号。在这些和其他场景中,边缘人工智能在利用所有数据来开发可行的见解、采取纠正措施或提供安全方面发挥着重要作用。 边缘人工智能允许在靠近实际收集数据的地方进行计算,而不是在集中式云计算设施或异地数据中心进行计算。 当紧迫性和时机至关重要时,边缘人工智能会挑战云的能力。 例如,在自动驾驶汽车中,数据是实时捕获的,但汽车却以每小时 65 英里的速度行驶。 没有时间将数据发送到云端然后返回决策。 必须立即做出决定。边缘优势比比皆是考虑以下一些主要好处:实时决策:边缘人工智能可以帮助设备做出关键决策,而不会产生与基于云的处理相关的延迟。 例如,自动驾驶汽车可以对不断变化的路况做出快速反应,确保乘客安全。隐私和安全:边缘计算还提供安全优势。 从位置传输到云的数据可以在位置之间被黑客攻击,但是当数据在边缘本地处理时,数据不需要通过网络移动。 这在视频监控摄像头等用户隐私至关重要的应用中尤其重要。有限连接:在偏远地区或互联网连接不可靠的地方,边缘人工智能可以独立运行,提供不间断的服务。 这对于农业地区是有益的,配备边缘人工智能的无人机可以监控连接有限的地区的农作物和牲畜。降低成本:边缘人工智能减少了对大规模且昂贵的云基础设施的需求。 企业可以节省数据传输成本并立即访问数据,从而提高效率。可扩展性:边缘人工智能具有高度可扩展性,允许将其他设备轻松添加到边缘计算网络,而不会导致中央云服务器过载。可靠性:通过将人工智能分布在多个设备或节点上,边缘人工智能更具弹性。 即使一台设备发生故障,其他设备也可以继续独立运行,从而降低系统范围内发生故障的风险。安全性:除了上述可穿戴物联网设备的安全优势之外,边缘人工智能还避免了分析师手动收集数据的人身安全隐患。 例如,有人被派去分析受自然灾害影响的建筑物的结构完整性。 当检查过程自主完成时,他们能够在世界另一端办公室的安全范围内实时分析数据。生活在边缘的挑战尽管将人工智能扩展到边缘有很多好处,但它也并非没有局限性。 其中一项挑战是其有限的计算资源。 与数据中心相比,边缘设备的计算能力有限。 这可能会对需要在其上运行的人工智能模型的复杂性造成限制。此外,边缘设备通常由电池供电,而人工智能模型通常需要大量电量,并且会很快耗尽电池寿命。 然而,研究人员正在开发针对边缘设备优化的轻量级人工智能模型和算法。 这些模型在准确性和资源消耗之间取得了平衡,使边缘人工智能更加可行。另一个挑战是,虽然边缘人工智能降低了数据泄露的风险,但它可能会引起本地层面的数据隐私问题,并被视为侵入性的。尽管面临挑战,边缘人工智能仍有望实现显着增长和创新。 事实上,根据 Future Market Insights (FMI) 的数据,边缘人工智能市场预计在 2022 年至 2023 年期间将以 20.8% 的复合年增长率扩张。最新一代无线网络连接 5G 网络的推出将有助于边缘人工智能的兴起,为边缘设备提供更快、更可靠的连接。 此类用例之一是仓库或工业环境,这些环境通常依赖 Wi-Fi。他们现在能够建立一个专用的本地5G网络,连接分布在整个站点的许多设备和物联网传感器。边缘人工智能为数据收集和分析方式提供了另一种选择。 其减少的延迟、数据隐私和成本效率使许多行业的智能达到了新的水平。 不是把数据交给算法,而是算法去处理数据,从而实现一个全新的洞察力。转载自:cid:link_0
  • [技术干货] 工业5.0:融合技术大趋势,塑造智慧城市的未来【转】
    这一新阶段的标志是,深度技术发展和采用的空前增加,全球人口统计的重大变化,以及即将过渡到Web 3.0。工业5.0的本质在于,其能够将人类的创造力与先进的技术系统相结合,促进更加个性化、可持续和以人为本的工业生产方式,并建设可持续的智慧城市。这个时代是为了提高效率和丰富子孙后代的生活质量。 技术大趋势融合的影响技术大趋势的融合从根本上重塑了经济格局,产生了新的经济。这些趋势包括人工智能(AI)、物联网(IoT)、机器人、生物技术等的发展。随着这些技术的融合,它们催化了新的市场动态和投资机会的出现,突出了创新在推动经济增长和可持续性方面的重要性。新兴经济体的崛起整合先进技术正在催生新型经济,其中数字平台、可持续能源解决方案和生物技术创新成为经济活动的基石。这些经济体利用人工智能和机器学习的力量来创造更高效、更自主的系统,推动行业向前发展。投资增加随着工业5.0带来革命性变化的承诺,针对高科技行业的投资大幅增加。从人工智能驱动的分析到可再生能源技术,世界各地的风险投资家和政府都在将资源投入到有望推动下一波工业革命的技术中。不断增长的元宇宙和不断发展的工业全宇宙成熟的元宇宙提供了一个全新的全球沉浸空间,用户可以在这里生活、工作、购物和娱乐。与此同时,整个工业领域正在快速发展,并将通过提供前所未有的操作可见性、预测分析和系统效率来彻底改变行业。构建智慧城市生态系统随着智慧城市生态系统的发展,城市景观也在发生根本性的变化。这些生态系统利用物联网、人工智能和大数据来创造更宜居、更有弹性和更可持续的城市。从智能交通系统到智能电网,为可持续地支持子孙后代的城市环境奠定了基础。工业5.0的挑战随着工业0.5的发展,带来了法律和监管方面的挑战。最重要的是,为工业制订0.5标准,确保不同技术系统之间的互操作性,并建立一个网络道德框架。这些挑战要求决策者、技术人员和行业领导人开展全球对话,以建立一个有凝聚力的监管框架,在保护个人权利和促进道德标准的同时支持创新。在这个时代,制定和部署强大的、积极主动的网络道德计划是修复、获得或维持数字信任的必要条件。工业5.0的未来方向以下几项关键技术将影响工业5.0的发展轨迹:量子计算:量子计算有望彻底改变数据处理方式,使各行业能够以比当前能力快数百万倍的速度解决复杂问题。6G网络:6G的出现将带来超可靠、高速的通信,支持工业5.0技术所需的海量数据流。卫星互联网:卫星互联网提供全球宽带覆盖,将确保偏远和服务不足地区参与数字经济。自主系统:自主系统将提高智慧城市生态系统的效率、安全性和可持续性。 脑脑机接口:如果以负责任的方式部署,脑机接口(BCI)将通过将人类认知与技术结合起来,提高生产力并优化人机协作,从而改变工业5.0,开创一个互联和高效的新时代。总结当我们在复杂的工业5.0中前进时,面临着许多必须克服的复杂挑战。但是,这也充满了重新定义工业格局和为未来世代建设智慧城市的机会。通过正面解决法律、监管和互操作性的问题,我们可以充分利用融合技术大趋势的潜力。工业5.0的未来不仅仅是技术进步,而是创造一个更加互联、可持续和以人为本的生态系统。通过合作、负责任的创新和远见,我们可以为未来奠定基础,利用量子计算、6G、卫星互联网、自主系统和脑机接口的优势,为工业和社会繁荣的新时代铺平道路。转载自:cid:link_0
  • [技术干货] 模型压缩部署概述【转载】
    一、模型在线部署深度学习和计算机视觉方向除了算法训练/研究,还有两个重要的方向: 模型压缩(模型优化、量化)、模型部署(模型转换、后端功能SDK开发)。所谓模型部署,即将算法研究员训练出的模型部署到具体的端边云芯片平台上,并完成特定业务的视频结构化应用开发。现阶段的平台主要分为云平台(如英伟达 GPU)、手机移动端平台(ARM 系列芯片)和其他嵌入式端侧平台(海思 3519、安霸 CV22、地平线 X3、英伟达 jetson tx2 等芯片)。对于模型部署/移植/优化工程师来说,虽然模型优化、量化等是更有挑战性和技术性的知识,但是对于新手的我们往往是在做解决模型无法在端侧部署的问题,包括但不限于:实现新 OP、修改不兼容的属性、修改不兼容的权重形状、学习不同芯片平台的推理部署框架等。对于模型转换来说,现在行业主流是使用 Caffe 和 ONNX 模型作为中间模型。1.1,深度学习项目开发流程在高校做深度学习 demo 应用一般是这样一个过程,比如使用 Pytorch/TensorFlow 框架训练出一个模型,然后直接使用 Pytorch 框架做推理(test)完成功能验证,但是在工业界这是不可能的,因为这样模型推理速度很慢,一般我们必须有专门的深度学习推理加速框架去做模型推理(inference)。以 GPU 云平台推理框架 TensorRT 为例,简单描述模型训练推理过程就是:训练好网络模型(权重参数数据类型为 FP32)输入 TensorRT,然后 TensorRT 做解析优化,并进行在线推理和输出结果。两种不同的模型训练推理过程对比如下图所示: 前面的描述较为简单,实际在工业届,理想的深度学习项目开发流程应该分为三个步骤: 模型离线训练、模型压缩和模型在线部署,后面两个步骤互有交叉,具体详情如下:模型离线训练:实时性低,数据离线且更新不频繁,batchsize 较大,消耗大量 GPU 资源。设计开发模型网络结构;准备数据集并进行数据预处理、EDA 等操作;深度学习框架训练模型:数据增强、超参数调整、优化器选择、训练策略调整(多尺度训练)、TTA、模型融合等;模型测试。模型优化压缩:主要涉及模型优化、模型转换、模型量化和模型编译优化,这些过程很多都在高性能计算推理框架中集成了,各个芯片厂商也提供了相应的工具链和推理库来完成模型优化压缩。实际开发中,在不同的平台选择不同的推理加速引擎框架,比如 GPU 平台选择 TensorRT,手机移动端(ARM)选择 NCNN/MNN,NPU 芯片平台,如海思3519、地平线X3、安霸CV22等则直接在厂商给出的工具链进行模型的优化(optimizer)和压缩。模型优化 Optimizer:主要指计算图优化。首先对计算图进行分析并应用一系列与硬件无关的优化策略,从而在逻辑上降低运行时的开销,常见的类似优化策略其包括:算子融合(conv、bn、relu 融合)、算子替换、常数折叠、公共子表达式消除等。模型转换 Converter:Pytorch->Caffe、Pytorch->ONNX、ONNX模型->NCNN/NPU芯片厂商模型格式(需要踩坑非常多,Pytorch、ONNX、NPU 三者之间的算子要注意兼容)。注意 ONNX 一般用作训练框架和推理框架之间转换的中间模型格式。模型量化 Quantizer:主要指训练后量化(Post-training quantization PTQ);权重、激活使用不同的量化位宽,如速度最快的量化方式 w8a8、速度和精度平衡的量化方式 w8a16。模型编译优化(编译优化+NPU 指令生成+内存优化)Compiler:模型编译针对不同的硬件平台有不同优化方法,与前面的和硬件无关的模型层面的优化不同。GPU平台存在 kernel fusion 方法;而 NPU 平台算子是通过特定二进制指令实现,其编译优化方法包括,卷积层的拆分、卷积核权重数据重排、NPU 算子调优等。模型部署/SDK输出: 针对视频级应用需要输出功能接口的SDK。实时性要求高,数据线上且更新频繁,batchsize 为 1。主要需要完成多模型的集成、模型输入的预处理、非DL算法模块的开发、 各个模块 pipeline 的串联,以及最后 c 接口(SDK)的输出。板端框架模型推理: Inference:C/C++。不同的 NPU 芯片/不同的公司有着不同的推理框架,但是模型的推理流程大致是一样的。包括:输入图像数据预处理、加载模型文件并解析、填充输入图像和模型权重数据到相应地址、模型推理、释放模型资源。这里主要需要学习不同的模型部署和推理框架。pipeline 应用开发: 在实际的深度学习项目开发过程中,模型推理只是其中的基础功能,具体的我们还需要实现多模型的集成、模型输入前处理、以及非 DL 算法模块的开发: 包括检测模块、跟踪模块、选帧模块、关联模块和业务算法模块等,并将各模块串联成一个 pipeline,从而完成视频结构化应用的开发。SDK集成: 在完成了具体业务 pipeline 的算法开发后,一般就需要输出 c 接口的 SDK 给到下层的业务侧(前后端)人员调用了。这里主要涉及 c/c++ 接口的转换、pipeline 多线程/多通道等sample的开发、以及大量的单元、性能、精度、稳定性测试。芯片平台板端推理 Inference,不同的 NPU 芯片有着不同的 SDK 库代码,但是模型运行流程类似。不同平台的模型的编译优化是不同的,比如 NPU 和一般 GPU 的区别在于后端模型编译上,GPU 是编译生成 kernel library(cuDNN 函数),NPU 是编译生成二进制指令;前端的计算图优化没有本质区别,基本通用。所以综上所述,深度学习项目开发流程可以大致总结为三个步骤: 模型离线训练、模型优化压缩和模型部署/SDK输出,后两个步骤互有交叉。前面 2 个步骤在 PC 上完成,最后一个步骤开发的代码是需要在在 AI 芯片系统上运行的。最后以视差模型在海思 3519 平台的部署为例,其模型部署工作流程如下: 1.2,模型训练和推理的不同为了更好进行模型优化和部署的工作,需要总结一下模型推理(Inference)和训练(Training)的不同:网络权重值固定,只有前向传播(Forward),无需反向传播,因此:模型权值和结构固定,可以做计算图优化,比如算子融合等;输入输出大小固定,可以做 memory 优化,比如 feature 重排和 kernel 重排。batch_size 会很小(比如 1),存在 latency 的问题。可以使用低精度的技术,训练阶段要进行反向传播,每次梯度的更新是很微小的,需要相对较高的精度比如 FP32 来处理数据。但是推理阶段,对精度要求没那么高,现在很多论文都表明使用低精度如 in16 或者 int8 数据类型来做推理,也不会带来很大的精度损失。二、手机端CPU推理框架的优化对于 HPC 和软件工程师来说,在手机 CPU 端做模型推理框架的优化,可以从上到下考虑:算法层优化:最上面就是算法层,如可以用winograd从数学上减少乘法的数量(仅在大channel尺寸下有效);框架优化:推理框架可以实现内存池、多线程等策略;硬件层优化:主要包括: 适应不同的硬件架构特性、pipeline和cache优化、内存数据重排、NEON 汇编优化等。转自:cid:link_0
  • [技术干货] 实战案例!Python批量识别银行卡号码并且写入Excel,小白也可以轻松使用~【转】
    今天我们就来学习一下,如何用1行代码,自动识别银行卡信息并且自动生成Excel文件~ 第一步:识别一张银行卡识别银行卡的代码最简单,只需要1行腾讯云AI的第三方库potencent的代码,如下所示。左右滑动,查看全部。👇# pip install potencent import potencent # 可以填写本地图片的地址:img_path,也可以填写在线图片的地址:img_url # 如果2个都填,则只用在线图片 res = potencent.ocr.BankCardOCR( img_path=r'C:\Users\程序员晚枫的文件夹\银行卡图片', img_url='https://python-office-1300615378.cos.ap-chongqing.myqcloud.com/2-free-group.jpg', configPath=r'配置文件的信息,可以不填,默认是同级目录下的potencent-config.toml') print(res)识别后的返回结果,几乎涵盖所有银行卡上肉眼可见的内容。👇{ "CardNo": "621700888888888889", "BankInfo": "建设银行(01050000)", "ValidDate": "08/2026", "CardType": "借记卡", "CardName": "龙卡通", "RequestId": "86b70007-3ef5-4b7e-8685-556b0a7df1c9" }支持对中国大陆主流银行卡正反面关键字段的检测与识别,包括卡号、卡类型、卡名字、银行信息、有效期。支持竖排异形卡识别、多角度旋转图片识别。支持对复印件、翻拍件、边框遮挡的银行卡进行告警,可应用于各种银行卡信息有效性校验场景,如金融行业身份认证、第三方支付绑卡等场景。 以上代码中,关于potencent-config.toml的配置方法,可以参考昨天视频的讲解👇第二步:写入Excel想把上面这个代码用来识别大量银行卡信息,并且将识别后的返回数据,全部写入Excel文件。代码如下👇import os from os.path import join import pandas as pd # home_path = "你存放大量银行卡图片的位置" home_path = r"C:\Users\Lenovo\Desktop\temp\test\card" res_df = pd.DataFrame() for (root, dirs, files) in os.walk(home_path): for file in files: single_res = potencent.ocr.BankCardOCR(img_path=join(root, file)) single_res = json.loads(single_res.to_json_string()) line_df = pd.DataFrame(single_res, index=[0]) print(line_df) res_df = res_df.append(other=line_df) print(res_df) res_df.to_excel(r"./银行卡信息(程序员晚枫).xlsx")运行后的结果如下,会在同级目录下,生成一个Excel文件 第三步:优化思路以上代码还可以进一步优化,例如:路径处理改为Path方法,适配更多的平台变量名称更简洁index改为序号但优化的前提是程序能运行成功,赶紧去跑起来吧~转载自:cid:link_0
  • [技术干货] 多模态深度学习方法综述【转】
    多模态方法种类多模态深度学习是指将来自不同感知模态的信息(如图像、文本、语音等)融合到一个深度学习模型中,以实现更丰富的信息表达和更准确的预测。在多模态深度学习中,模型之间的融合通常有以下三种方法: 模态联合学习(Multimodal Joint Learning):模态联合学习是一种联合训练的方法,将来自不同模态的数据输入到一个模型中,模型可以同时学习到多个模态的特征表示,并将这些特征表示融合在一起进行决策。这种方法的优点是可以充分利用多个模态的信息,但是需要同时训练多个模型,计算复杂度较高。跨模态学习(Cross-Modal Learning):跨模态学习是一种将一个模态的特征转换为另一个模态的特征表示的方法。这种方法的目的是通过跨模态学习,学习到多个模态之间的映射关系,并将不同模态的信息融合在一起。例如,可以使用图像的特征表示来预测文本的情感极性。这种方法可以减少训练时间和计算复杂度,但是需要预先确定好模态之间的映射关系。多模态自监督学习(Multimodal Self-Supervised Learning):多模态自监督学习是一种无需标注数据,通过模型自身学习来提取多个模态的特征表示的方法。这种方法的优点是可以利用大量未标注的数据进行训练,但是需要设计一些自监督任务来引导模型学习多模态的特征表示。例如,可以通过学习视觉音频同步、图像文本匹配等任务来进行多模态自监督学习。总的来说,这三种方法都可以用于多模态深度学习中模型之间的融合,具体选择哪一种方法需要根据具体的任务和数据情况进行决策。多模态深度学习模型的方法和相关论文的详细说明模态联合学习(Multimodal Joint Learning):模态联合学习是一种将多个模态的信息融合在一个模型中进行联合训练的方法。这种方法的研究背景是,现实生活中的很多任务需要同时利用多个感知模态的信息,例如语音识别、人脸识别、情感分析等。模态联合学习的目的是在一个统一的框架下,将来自不同模态的信息进行融合,提高任务的表现。一篇典型的使用模态联合学习方法的论文是2018年的“Multi-Modal Deep Learning for Robust RGB-D Object Recognition”,作者提出了一种基于深度学习的多模态目标识别方法。该方法使用了一个深度卷积神经网络(CNN)和一个多层感知器(MLP)组成的多模态模型来处理来自RGB-D传感器的数据。具体地,CNN用于处理RGB图像,MLP用于处理深度图像,两个模型的输出在特征层级别进行融合。实验结果表明,该方法相对于单模态方法和其他多模态方法具有更好的识别性能。跨模态学习(Cross-Modal Learning):跨模态学习是一种将一个模态的特征转换为另一个模态的特征表示的方法。这种方法的研究背景是,现实生活中的不同感知模态之间存在着复杂的关联性和相互依赖性。跨模态学习的目的是学习到不同模态之间的映射关系,实现跨模态信息的转换和融合。一篇典型的使用跨模态学习方法的论文是2018年的“Image Captioning with Semantic Attention”,作者提出了一种基于卷积神经网络(CNN)和长短时记忆网络(LSTM)的图像描述模型。该模型首先使用CNN提取图像的特征表示,然后使用LSTM生成对图像的描述。在生成描述时,模型还使用了一个注意力机制,将图像中的重要区域与生成的文本序列进行对齐。实验结果表明,该方法相对于其他方法具有更好的描述性能,能够生成更准确和更生动的图像描述。多模态自监督学习(Multimodal Self-Supervised Learning):多模态自监督学习是一种无需标注数据,通过模型自身学习来提取多个模态的特征的方法。这种方法的研究背景是,现实生活中的很多任务需要大量标注数据才能进行训练,但标注数据的获取成本很高。多模态自监督学习的目的是通过模型自身学习来利用未标注的数据,提高模型的泛化性能。一篇典型的使用多模态自监督学习方法的论文是2020年的“Unsupervised Learning of Multimodal Representations with Deep Boltzmann Machines”,作者提出了一种基于深度玻尔兹曼机(DBM)的无监督多模态特征学习方法。该方法使用了两个DBM分别处理来自图像和文本的数据,并在两个DBM之间添加了一个嵌入层,将图像和文本的特征进行融合。在训练过程中,模型使用了对比散度(CD)算法进行参数更新。实验结果表明,该方法相对于其他无监督方法和有监督方法具有更好的多模态特征表示能力。综上所述,多模态深度学习的三种方法分别是魔胎联合学习、跨模态学习和多模态自监督学习。这些方法的研究背景、目的、使用的方法和相关论文都有所不同。在实际应用中,研究人员可以根据具体任务和数据特点选择适合的方法,并根据需要对方法进行改进和扩展。多模态方法实现可以使用PaddlePaddle深度学习框架实现多模态深度学习的三种方法。下面是三种方法的简单实现说明。模态联合学习模态联合学习是将不同模态的特征提取网络联合在一起,以共同学习任务特征的方法。在PaddlePaddle中可以使用PaddleHub提供的预训练模型完成模态联合学习,例如使用PaddleHub提供的图像分类和文本分类模型,分别获得图像和文本的特征表示,然后将这些特征表示合并在一起,用于进行多模态任务的学习和预测。以下是基于PaddleHub实现的示例代码:import paddlehub as hub # 加载图像分类模型 image_classifier = hub.Module(name="resnet50_vd") # 加载文本分类模型 text_classifier = hub.Module(name="ernie") # 分别对图像和文本进行特征提取 image_feature = image_classifier.feature(input_images) text_feature = text_classifier.feature(input_texts) # 将图像和文本的特征表示合并在一起 multimodal_feature = paddle.concat([image_feature, text_feature], axis=-1) # 使用多模态特征进行任务学习和预测跨模态学习跨模态学习是将不同模态的数据映射到共同的空间中,以便可以使用相同的特征提取器和分类器进行训练和预测。在PaddlePaddle中可以使用自定义模型实现跨模态学习。以下是一个基于PaddlePaddle实现的跨模态学习的示例代码:import paddle # 定义图像模态的特征提取器 image_feature_extractor = paddle.nn.Sequential( paddle.nn.Conv2D(...), paddle.nn.BatchNorm2D(...), paddle.nn.ReLU(), ... ) # 定义文本模态的特征提取器 text_feature_extractor = paddle.nn.Sequential( paddle.nn.Embedding(...), paddle.nn.LSTM(...), ... ) # 定义特征融合层 fusion_layer = paddle.nn.Sequential( paddle.nn.Linear(...), paddle.nn.ReLU(), ... ) # 定义分类器 classifier = paddle.nn.Linear(...) # 定义跨模态学习模型 class CrossModalModel(paddle.nn.Layer): def __init__(self): super().__init__() self.image_feature_extractor = image_feature_extractor self.text_feature_extractor = text_feature_extractor self.fusion_layer = fusion_layer self.classifier = classifier def forward(self, image_data, text_data): image_feature = self.image_feature_extractor(image_data) text_feature = self.text_feature_extractor(text_data) fused_feature = self.fusion_layer(paddle.concat([image_feature, text_feature], axis=-1)) output = self.classifier(fused_feature) return output # 使用跨模态学习模型进行任务学习和预测多模态自监督学习多模态自监督学习是一种利用多模态数据自身特点设计的自监督学习方法,通常不需要标注数据。在PaddlePaddle中可以使用PaddleClas提供的模型进行多模态自监督学习,例如使用PaddleClas提供的SimCLR模型,该模型使用数据增强和对比学习方法进行多模态特征学习,以提高模型在多模态数据上的表现。以下是一个基于PaddleClas实现的多模态自监督学习的示例代码:import paddle import paddlehub as hub from paddle.io import DataLoader from paddle.vision.transforms import transforms from paddle.vision.datasets import ImageNet, Cifar10 # 定义图像数据集的预处理器 image_transforms = transforms.Compose([ transforms.Resize((224, 224)), transforms.Normalize(...), ... ]) # 加载图像数据集 image_dataset = ImageNet(..., transform=image_transforms) # 加载文本数据集 text_dataset = ... # 定义数据加载器 batch_size = 64 image_data_loader = DataLoader(image_dataset, batch_size=batch_size) text_data_loader = DataLoader(text_dataset, batch_size=batch_size) # 加载SimCLR模型 simclr = hub.Module(name="simclr") # 使用多模态数据进行自监督学习 for image_data, text_data in zip(image_data_loader, text_data_loader): # 将图像和文本数据进行拼接 multimodal_data = paddle.concat([image_data, text_data], axis=0) # 进行数据增强 augmented_data = simclr.augment(multimodal_data) # 获取特征表示 features = simclr(multimodal_data) # 计算对比损失 loss = simclr.contrastive_loss(features, augmented_data) # 反向传播更新模型参数 loss.backward()转自:cid:link_0
  • [技术干货] 使用LabVIEW实现 DeepLabv3+ 语义分割含源码【转】
    前言图像分割可以分为两类:语义分割(Semantic Segmentation)和实例分割(Instance Segmentation),前面已经给大家介绍过两者的区别,并就如何在labview上实现相关模型的部署也给大家做了讲解,今天和大家分享如何使用labview 实现deeplabv3+的语义分割,并就 Pascal VOC2012 (DeepLabv3Plus-MobileNet) 上的分割结果和城市景观的分割结果(DeepLabv3Plus-MobileNet)给大家做一个分享。一、什么是deeplabv3+Deeplabv3+是一个语义分割网络,使用DeepLabv3作为Encoder模块,并添加一个简单且有效的Decoder模块来获得更清晰的分割。即网络主要分为两个部分:Encoder和Decoder;论文中采用的是Xception作为主干网络(在代码中也可以根据需求替换成MobileNet,本文示例中即使用的MobileNet),然后使用了ASPP结构,解决多尺度问题;为了将底层特征与高层特征融合,提高分割边界准确度,引入Decoder部分。Encoder-Decoder网络已经成功应用于许多计算机视觉任务,通常,Encoder-Decoder网络包含:逐步减少特征图并提取更高语义信息的Encoder模块逐步恢复空间信息的Decoder模块二、LabVIEW调用DeepLabv3+实现图像语义分割1、模型获取及转换下载预训练好的.pth模型文件,下载链接: cid:link_2 ,我们选择主干网络为Mobilenet的模型 git上下载开源的整个项目文件,链接为: cid:link_0根据requirements.txt 安装所需要的库pip install -r requirements.txt原项目中使用的模型为.pth,我们将其转onnx模型,将best_deeplabv3plus_mobilenet_voc_os16.pth转化为deeplabv3plus_mobilenet.onnx,具体转化模型代码如下:import network import numpy as np import torch from torch.autograd import Variable from torchvision import models import os import re dirname, filename = os.path.split(os.path.abspath(__file__)) print(dirname) def get_pytorch_onnx_model(original_model): # define the directory for further converted model save onnx_model_path = dirname # define the name of further converted model onnx_model_name = "deeplabv3plus_mobilenet.onnx" # create directory for further converted model os.makedirs(onnx_model_path, exist_ok=True) # get full path to the converted model full_model_path = os.path.join(onnx_model_path, onnx_model_name) # generate model input generated_input = Variable( torch.randn(1, 3, 513, 513) ) # model export into ONNX format torch.onnx.export( original_model, generated_input, full_model_path, verbose=True, input_names=["input"], output_names=["output"], opset_version=11 ) return full_model_path model = network.modeling.__dict__["deeplabv3plus_mobilenet"](num_classes=21, output_stride=8) checkpoint = torch.load("best_deeplabv3plus_mobilenet_voc_os16.pth", map_location=torch.device('cpu')) model.load_state_dict(checkpoint["model_state"]) full_model_path = get_pytorch_onnx_model(model)将best_deeplabv3plus_mobilenet_cityscapes_os16.pth转化为deeplabv3plus_mobilenet_cityscapes.onnx,具体转化模型代码如下:import network import numpy as np import torch from torch.autograd import Variable from torchvision import models import os import re dirname, filename = os.path.split(os.path.abspath(__file__)) print(dirname) def get_pytorch_onnx_model(original_model): # define the directory for further converted model save onnx_model_path = dirname # define the name of further converted model onnx_model_name = "deeplabv3plus_mobilenet_cityscapes.onnx" # create directory for further converted model os.makedirs(onnx_model_path, exist_ok=True) # get full path to the converted model full_model_path = os.path.join(onnx_model_path, onnx_model_name) # generate model input generated_input = Variable( torch.randn(1, 3, 513, 513) ) # model export into ONNX format torch.onnx.export( original_model, generated_input, full_model_path, verbose=True, input_names=["input"], output_names=["output"], opset_version=11 ) return full_model_path model = network.modeling.__dict__["deeplabv3plus_mobilenet"](num_classes=19, output_stride=8) checkpoint = torch.load("best_deeplabv3plus_mobilenet_cityscapes_os16.pth", map_location=torch.device('cpu')) model.load_state_dict(checkpoint["model_state"]) full_model_path = get_pytorch_onnx_model(model)注意:我们需要将以上两个脚本保存并与network文件夹同路径2、LabVIEW 调用基于 Pascal VOC2012训练的deeplabv3+实现图像语义分割 (deeplabv3+_onnx.vi)经过实验发现,opencv dnn因缺少一些算子,所以无法加载deeplabv3+ onnx模型,所以我们选择使用LabVIEW开放神经网络交互工具包【ONNX】来加载并推理整个模型,实现语义分割,程序源码如下: 3、LabVIEW Pascal VOC2012上的分割结果(deeplabv3+_onnx.vi)4、LabVIEW 调用基于 Cityscapes 训练的deeplabv3+实现图像语义分割 (deeplabv3+_onnx_cityscape.vi)如下图所示即为程序源码,我们对比deeplabv3+_onnx.vi,发现其实只需要把模型和待检测的图片更换,图片尺寸比例也做一个修改即可 5、LabVIEW 城市景观的分割结果(deeplabv3+_onnx_cityscape.vi)转载自:cid:link_1
  • [技术干货] AI辅助编程现状:AI工具提高了速度,但错误代码也大幅增加【转】
    前言在软件开发领域,AI工具越来越流行。去年GitHub发布报告称,有了AI辅助工具,开发者编程速度提高55%。但是,AI工具辅助编写的代码是不是更好呢?GitClear对2020年1月至2023年12月间编写的1.53亿行代码进行检查发现,相比以前,编写之后修改的代码行数明显增加,2024年相比2021年增加了一倍。换言之,有了AI工具,虽然编程速度加快了,但在第一次编写时错误也大大增加了。形象地说,用AI辅助编写代码,就像聘请一名短期合同工为你工作,他关心的是如何编写冗长的代码,而不是保证代码的可维护性。AI会复制原有代码的错误开发者安全公司Snyk在报告中指出,GitHub AI编程辅助工具Copilot并不安全,如果已有代码库本身存在安全问题,工具编写的代码同样也会不安全。Snyk在2月22日的报告中指出,Copilot会复制代码中存在的安全问题,如此一来,已有安全隐患会让Copilot代码更加不安全。市场上已经出现不少生成式AI编程工具,比如亚马逊CodeWhisperer,ChatGPT等。现有工具的最大问题在于:它无法理解语义,所以无法对代码作出评判。GitHub Copilot从海量过往代码中学习,形成特定模式和结构,然后生成代码片段。这套学习方法有一定优势,但也有一个缺陷。Copilot代码可能会复制已有安全漏洞,或者复制相邻文件中的不良案例。如何降低影响呢?Snyk给出一些建议:包括开发者手动检查代码;安全团队应该设立SAST护栏;开发者应该遵守安全编程指南;安全团队应该给开发团队培训,将每个团队的积压问题分类,按优先级排序;执行团队应该强制设置安全护栏。一般来说,平均每个商务软件项目的第一手代码都会有40个漏洞,当中约三分之一都是高危漏洞。AI生成工具会复制这些漏洞,影响恶劣。跨站脚本攻击(cross-site scripting,XSS)、路径穿越(Path Traversal)、SQL注入、硬编码加密密钥等安全问题比较常见。所以,行业几乎有一个共识:就眼下来看,AI辅助编程还没有迎来黄金时代,AI还不够好。但AI辅助编程未来可期GitHub CEO Thomas Dohmke不久前接受采访时表示:“开发者已经进入AI时代。现在的问题已经很明确,你准备以多快的速度上船?你是不是准备继续沉醉于过去,站在历史错误的一边,忽视生产力提升的大好机遇?”GitHub Copilot实际上归微软所有,最新财报显示,最近一个季度Copilot付费用户数已经突破130万,相比前一个季度猛增30%,已经有5万家企业使用Copilot。Thomas Dohmke称,平台上用户编写的代码约有一半是AI生成的。Thomas Dohmke认为,社区已经普遍接受一个观点,即AI生成代码需要人类程序员监督审核。值得一提的是,新手程序员特别喜欢使用Copilot,因为它能协助解决编程难题。随着编程自动化程度的增加,代码中的错误可能会越来越多,这点其实已经引起争论。Thomas Dohmke称,自Copilot引入之后错误增加数量比较“正常”,没有证据证明AI导致错误猛增。真是这样吗?未必。新手程序员大规模使用AI,一旦出现错误,新手可能无法发现,整个代码的质量可能会下降。微软对AI工具充满期待,除了编程,它还希望Copilot能帮助用户写邮件、制作电子表格、分析Office文档。微软甚至还为Windows PC键盘增加一个“Copilot”按键。谷歌也在开发类似工具。微软CEO纳德拉在最近的财报会议上表示,围绕GitHub Copilot和它的生产力问题,我们已经看到很多的证据和数据,结果不错。纳德拉预计其它Copilot应用也会带来良好效果。总之,目前Copilot还是新生事物,相信再过一段时间,当我们拥有更多数据,就能对上述问题有更深刻理解。(小刀)
  • [技术干货] 紧跟时事!一个支持Sora模型文本生成视频的Web客户端【转】
    前言今天,给大家推荐一个最近十分火热的开源项目,一个支持使用 Sora 模型将文本生成视频的 Web 客户端。项目介绍SoraWebui —— 一个开源的项目,允许用户使用 OpenAI 的 Sora 模型使用文本在线生成视频,支持一键部署。 SoraWebui 项目创建不到两个礼拜,就斩获了 1000 多个 Star! 由于 OpenAI 还未开放 Sora 的 API,因此 SoraWebui 目前只是一个空壳框架。等待后续 API 开发,即可快速集成 Sora.此外,SoraWebui 需要 FakeSoraAPI 服务提供的接口支持。快速开始SoraWebui1、克隆项目git clone https://github.com/SoraWebui/SoraWebui.git2、安装依赖cd SoraWebui && yarn #or cd SoraWebui && npm install #or cd SoraWebui && pnpm install3、修改配置文件 复制 .env.example 并将其重命名为 .env.local# website URL NEXT_PUBLIC_SITE_URL=cid:link_2 # openai config OPENAI_API_KEY=sk-XXXXXX OPENAI_API_BASE_URL=cid:link_1 OPENAI_API_MODEL=sora-1.0-turbo4、运行yarn dev #or npm run dev #or pnpm dev5、在浏览器中打开 cid:link_2 6、或者使用 Vercel 一键部署https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2FSoraWebui%2FSoraWebui&project-name=SoraWebui&repository-name=SoraWebui&external-id=https%3A%2F%2Fgithub.com%2FSoraWebui%2FSoraWebui%2Ftree%2FmainFakeSoraAPI1、克隆项目git clone https://github.com/SoraWebui/FakeSoraAPI.git2、安装依赖cd FakeSoraAPI && yarn #or cd FakeSoraAPI && npm install #or cd FakeSoraAPI && pnpm install3、运行yarn dev #or npm run dev #or pnpm dev4、在浏览器打开 cid:link_15、或者使用 Vercel 一键部署https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2FSoraWebui%2FFakeSoraAPI&project-name=FakeSoraAPI&repository-name=FakeSoraAPI&external-id=https%3A%2F%2Fgithub.com%2FSoraWebui%2FFakeSoraAPI%2Ftree%2Fmain总结 Open AI 目前只是发布了 Sora 模型的预告视频,就引起了巨大的浪潮。想必等后续开放了 API,更是会引起热烈的反响。SoraWebui 帮我们提供了一个快速搭建使用 Sora 文本生成视频的网站,一旦拥有了 Sora 的 API Token,就可以快速迭代出一个文本生成视频的网站。最后,贴上项目地址:https://github.com/SoraWebui/SoraWebui转载自:cid:link_0
  • [技术干货] MoE模型性能还能更上一层楼?一次QLoRA微调实践【转】
    一、简介目前整个业界都希望经过优化的模型能够表现出卓越的性能,这一追求不断推动着自然语言理解(natural language understanding)的发展。Mixtral-8x7B Mixture of Experts(MoE)模型就是其中之一,该模型在各种基准测试(benchmarks)中表现出优于同类产品的性能,尤其是优于 Llama 2 70B。本教程采用一种名为 QLoRA 的创新方法对 Mixtral-8x7B 模型进行微调,该方法结合了量化(quantization)和 LoRA(Local Representation Adaptation)技术。期望通过这两种技术的结合来进一步增强Mixtral-8x7B模型的能力。二、相关定义● Mixtral 8x7B:一种混合专家模型,因其架构设计在自然语言处理任务中表现出色而闻名。● QLoRA:Quantization 和 LoRA 技术相结合的缩写。量化涉及降低模型权重的精度,从而优化内存使用并加快计算速度。LoRA 可调整模型中的局部表征,增强模型对特定上下文的理解。三、优势● 增强性能:使用 QLoRA 对 Mixtral 8x7B 进行微调,可提高其性能,从而更好地理解和生成各种领域的文本。● 能效比高:量化的整合降低了内存需求和计算复杂度,使模型更节省资源。● 针对垂直领域进行微调:通过微调,该模型可针对特定任务进行定制,从而提高其在特定领域的准确性和相关性。四、代码实现说明本教程在 Notebook 环境中(译者注:使用Jupyter notebook 或白海IDP自研notebook)使用 Python。整个过程包括使用 "bitsandbytes "库加载 4 位精度的大型 Mixtral 模型。随后,在训练阶段使用 Hugging Face 的 PEFT 库实现 LoRA。4.1 步骤 1:安装相关库# You only need to run this once per machine, even if you stop/restart it !pip install --upgrade pip !pip install -q -U bitsandbytes !pip install -q -U git+https://github.com/huggingface/transformers.git !pip install -q -U git+https://github.com/huggingface/peft.git !pip install -q -U git+https://github.com/huggingface/accelerate.git !pip install -q -U datasets scipy ipywidgets matplotlib4.2 步骤 2:设置 Acceleratorfrom accelerate import FullyShardedDataParallelPlugin, Accelerator from torch.distributed.fsdp.fully_sharded_data_parallel import FullOptimStateDictConfig, FullStateDictConfig fsdp_plugin = FullyShardedDataParallelPlugin( state_dict_config=FullStateDictConfig(offload_to_cpu=True, rank0_only=False), optim_state_dict_config=FullOptimStateDictConfig(offload_to_cpu=True, rank0_only=False), ) accelerator = Accelerator(fsdp_plugin=fsdp_plugin)4.3 步骤 3:使用Weights & Biases追踪性能指标!pip install -q wandb -U import wandb, os wandb.login() wandb_project = "viggo-finetune" if len(wandb_project) > 0: os.environ["WANDB_PROJECT"] = wandb_project4.4 步骤 4:加载数据集from datasets import load_dataset dataset_name = "databricks/databricks-dolly-15k" train_dataset = load_dataset(dataset_name, split="train[0:800]") eval_dataset = load_dataset(dataset_name, split="train[800:1000]")4.5 步骤 5:加载基础模型import torch from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig base_model_id = "mistralai/Mixtral-8x7B-v0.1" bnb_config = BitsAndBytesConfig( load_in_4bit=True, bnb_4bit_use_double_quant=True, bnb_4bit_compute_dtype=torch.bfloat16 ) model = AutoModelForCausalLM.from_pretrained(base_model_id, quantization_config=bnb_config, device_map="auto") # Tokenization tokenizer = AutoTokenizer.from_pretrained( base_model_id, padding_side="left", add_eos_token=True, add_bos_token=True, ) tokenizer.pad_token = tokenizer.eos_token def tokenize(prompt): result = tokenizer(prompt) result["labels"] = result["input_ids"].copy() return result def generate_and_tokenize_prompt(data_point): full_prompt = f"""Given a question and some additional context, provide an answer ### Target sentence: Question: {data_point['instruction']} Additional Context: {f"Here is some context: {data_point['context']}" if len(data_point["context"]) > 0 else ""} Response: [/INST] {data_point['response']}</s>""" tokenized_prompt = tokenizer(full_prompt) return tokenized_prompt tokenized_train_dataset = train_dataset.map(generate_and_tokenize_prompt) tokenized_val_dataset = eval_dataset.map(generate_and_tokenize_prompt) untokenized_text = tokenizer.decode(tokenized_train_dataset[1]['input_ids']) print(untokenized_text) # Output <s> Given a question and some additional context, provide an answer ### Target sentence: Question: Alice's parents have three daughters: Amy, Jessy, and what’s the name of the third daughter? Additional Context: Response: [/INST] The name of the third daughter is Alice</s></s>4.6 步骤 6:获取数据集中各个样本长度的分布情况import matplotlib.pyplot as plt def plot_data_lengths(tokenized_train_dataset, tokenized_val_dataset): lengths = [len(x['input_ids']) for x in tokenized_train_dataset] lengths += [len(x['input_ids']) for x in tokenized_val_dataset] print(len(lengths)) # Plotting the histogram plt.figure(figsize=(10, 6)) plt.hist(lengths, bins=20, alpha=0.7, color='blue') plt.xlabel('Length of input_ids') plt.ylabel('Frequency') plt.title('Distribution of Lengths of input_ids') plt.show() plot_data_lengths(tokenized_train_dataset, tokenized_val_dataset)4.7 步骤 7:在数据的左侧添加 padding ,以减少内存的使用max_length = 320 # This was an appropriate max length for my dataset # redefine the tokenize function and tokenizer tokenizer = AutoTokenizer.from_pretrained( base_model_id, padding_side="left", add_eos_token=True, add_bos_token=True, ) tokenizer.pad_token = tokenizer.eos_token def tokenize(prompt): result = tokenizer( prompt, truncation=True, max_length=max_length, padding="max_length", ) result["labels"] = result["input_ids"].copy() return result tokenized_train_dataset = train_dataset.map(generate_and_tokenize_prompt) tokenized_val_dataset = eval_dataset.map(generate_and_tokenize_prompt) untokenized_text = tokenizer.decode(tokenized_train_dataset[4]['input_ids']) print(untokenized_text) # Output <s> Given a target sentence construct the underlying meaning representation of the input sentence as a single function with attributes and attribute values. This function should describe the target string accurately and the function must be one of the following ['inform', 'request', 'give_opinion', 'confirm', 'verify_attribute', 'suggest', 'request_explanation', 'recommend', 'request_attribute']. The attributes must be one of the following: ['name', 'exp_release_date', 'release_year', 'developer', 'esrb', 'rating', 'genres', 'player_perspective', 'has_multiplayer', 'platforms', 'available_on_steam', 'has_linux_release', 'has_mac_release', 'specifier'] ### Target sentence: When did Virgin Australia start operating? Here is some context: Virgin Australia, the trading name of Virgin Australia Airlines Pty Ltd, is an Australian-based airline. It is the largest airline by fleet size to use the Virgin brand. It commenced services on 31 August 2000 as Virgin Blue, with two aircraft on a single route. It suddenly found itself as a major airline in Australia's domestic market after the collapse of Ansett Australia in September 2001. The airline has since grown to directly serve 32 cities in Australia, from hubs in Brisbane, Melbourne and Sydney. [/INST] Virgin Australia commenced services on 31 August 2000 as Virgin Blue, with two aircraft on a single route.</s></s>plot_data_lengths(tokenized_train_dataset, tokenized_val_dataset)4.8 步骤 8:设置 LoRAfrom peft import prepare_model_for_kbit_training model.gradient_checkpointing_enable() model = prepare_model_for_kbit_training(model) def print_trainable_parameters(model): """ Prints the number of trainable parameters in the model. """ trainable_params = 0 all_param = 0 for _, param in model.named_parameters(): all_param += param.numel() if param.requires_grad: trainable_params += param.numel() print( f"trainable params: {trainable_params} || all params: {all_param} || trainable%: {100 * trainable_params / all_param}" ) from peft import LoraConfig, get_peft_model config = LoraConfig( r=8, lora_alpha=16, target_modules=[ "q_proj", "k_proj", "v_proj", "o_proj", "w1", "w2", "w3", "lm_head", ], bias="none", lora_dropout=0.05, # Conventional task_type="CAUSAL_LM", ) model = get_peft_model(model, config) print_trainable_parameters(model) # Apply the accelerator. You can comment this out to remove the accelerator. model = accelerator.prepare_model(model) # Output trainable params: 120350720 || all params: 23602952192 || trainable%: 0.50989689349450014.9 步骤 9:进行训练import transformers from datetime import datetime if torch.cuda.device_count() > 1: # If more than 1 GPU model.is_parallelizable = True model.model_parallel = True project = "databricks-dolly-finetune" base_model_name = "mixtral" run_name = base_model_name + "-" + project output_dir = "./" + run_name tokenizer.pad_token = tokenizer.eos_token trainer = transformers.Trainer( model=model, train_dataset=tokenized_train_dataset, eval_dataset=tokenized_val_dataset, args=transformers.TrainingArguments( output_dir=output_dir, warmup_steps=5, per_device_train_batch_size=1, gradient_checkpointing=True, gradient_accumulation_steps=4, max_steps=500, learning_rate=2.5e-5, logging_steps=25, fp16=True, optim="paged_adamw_8bit", logging_dir="./logs", # Directory for storing logs save_strategy="steps", # Save the model checkpoint every logging step save_steps=50, # Save checkpoints every 50 steps evaluation_strategy="steps", # Evaluate the model every logging step eval_steps=50, # Evaluate and save checkpoints every 50 steps do_eval=True, # Perform evaluation at the end of training report_to="wandb", # Comment this out if you don't want to use weights & baises run_name=f"{run_name}-{datetime.now().strftime('%Y-%m-%d-%H-%M')}" # Name of the W&B run (optional) ), data_collator=transformers.DataCollatorForLanguageModeling(tokenizer, mlm=False), ) model.config.use_cache = False # silence the warnings. Please re-enable for inference! trainer.train()4.10 步骤 10:使用训练完毕的模型import torch from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig base_model_id = "mistralai/Mixtral-8x7B-v0.1" bnb_config = BitsAndBytesConfig( load_in_4bit=True, bnb_4bit_use_double_quant=True, bnb_4bit_compute_dtype=torch.bfloat16 ) base_model = AutoModelForCausalLM.from_pretrained( base_model_id, # Mixtral, same as before quantization_config=bnb_config, # Same quantization config as before device_map="auto", trust_remote_code=True, use_auth_token=True ) eval_tokenizer = AutoTokenizer.from_pretrained( base_model_id, add_bos_token=True, trust_remote_code=True, )from peft import PeftModel ft_model = PeftModel.from_pretrained(base_model, "mixtral-databricks-dolly-finetune/checkpoint-100"eval_prompt = """Given a question and some additional context, provide an answer ### Target sentence: Question: When was Tomoaki Komorida born? Here is some context: Komorida was born in Kumamoto Prefecture on July 10, 1981. After graduating from high school, he joined the J1 League club Avispa Fukuoka in 2000. Although he debuted as a midfielder in 2001, he did not play much and the club was relegated to the J2 League at the end of the 2001 season. In 2002, he moved to the J2 club Oita Trinita. He became a regular player as a defensive midfielder and the club won the championship in 2002 and was promoted in 2003. He played many matches until 2005. In September 2005, he moved to the J2 club Montedio Yamagata. In 2006, he moved to the J2 club Vissel Kobe. Although he became a regular player as a defensive midfielder, his gradually was played less during the summer. In 2007, he moved to the Japan Football League club Rosso Kumamoto (later Roasso Kumamoto) based in his local region. He played as a regular player and the club was promoted to J2 in 2008. Although he did not play as much, he still played in many matches. In 2010, he moved to Indonesia and joined Persela Lamongan. In July 2010, he returned to Japan and joined the J2 club Giravanz Kitakyushu. He played often as a defensive midfielder and center back until 2012 when he retired. ### Response: """ model_input = eval_tokenizer(eval_prompt, return_tensors="pt").to("cuda") ft_model.eval() with torch.no_grad(): print(eval_tokenizer.decode(ft_model.generate(**model_input, max_new_tokens=100)[0], skip_special_tokens=True)) Given a question and some additional context, provide an answer ### Target sentence: Question: When was Tomoaki Komorida born? Here is some context: Komorida was born in Kumamoto Prefecture on July 10, 1981. After graduating from high school, he joined the J1 League club Avispa Fukuoka in 2000. Although he debuted as a midfielder in 2001, he did not play much and the club was relegated to the J2 League at the end of the 2001 season. In 2002, he moved to the J2 club Oita Trinita. He became a regular player as a defensive midfielder and the club won the championship in 2002 and was promoted in 2003. He played many matches until 2005. In September 2005, he moved to the J2 club Montedio Yamagata. In 2006, he moved to the J2 club Vissel Kobe. Although he became a regular player as a defensive midfielder, his gradually was played less during the summer. In 2007, he moved to the Japan Football League club Rosso Kumamoto (later Roasso Kumamoto) based in his local region. He played as a regular player and the club was promoted to J2 in 2008. Although he did not play as much, he still played in many matches. In 2010, he moved to Indonesia and joined Persela Lamongan. In July 2010, he returned to Japan and joined the J2 club Giravanz Kitakyushu. He played often as a defensive midfielder and center back until 2012 when he retired. ### Response: Tomoaki Komorida was born on July 10, 1981.五、结论利用 QLoRA 对 Mixtral-8x7B 模型进行微调是自然语言处理 (NLP) 领域的一个重要进展,它将模型性能提升到了新的高度。这一缜密的过程融合了量化和 LoRA 等前沿技术,为超越基准(benchmarks)提供了一条稳健的途径,甚至在各种评估指标上超越了强大的 Llama 2 70B 模型。本教程的核心在于使用QLoRA进行微调,利用bitsandbytes以4位精度实例化模型,并运用Hugging Face 🤗的PEFT库。该指南不仅概述了微调方法,还揭示了实践过程中可能遇到的问题,如OutOfMemory errors,为用户提供了精确的解决途径。从本质上讲,该教程并非是一个技术指南,更像一个倡导模型微调最佳实践的指引。它倡导协作式微调,请邀请其他研究人员和从业者一同踏上推动语言理解模型发展的旅程。前沿技术、详细的指导以及合作共赢的态度使得该教程对于NLP社区来说是一个非常重要且不可或缺的资源,期望能够引导 NLP 社区进一步提高模型性能,丰富理解能力。转载自:cid:link_0
  • [技术干货] 机器学习如何提高欺诈预防能力【转】
    前言在线欺诈是许多国家的严重问题,存在网络钓鱼攻击、身份盗窃和假冒电子商务网站等各种诈骗行为。一份报告显示,很大一部分欺诈交易发生在晚上10点至凌晨4点之间,其中60岁以上的信用卡持有者是主要受害者。机器学习有助于预防欺诈,使组织能够实时检测和防止可疑活动。传统的欺诈预防方法往往难以跟上诈骗者不断变化的策略。机器学习算法可以快速分析大量数据,帮助组织识别可能表明可疑行为的模式和异常。这些算法从过去的欺诈案例中学习,不断增强检测可疑活动的能力。通过将机器学习集成到欺诈预防策略中,组织可以领先于诈骗并有效保护其资产。机器学习在预防欺诈方面的一个关键优势是它能够在早期阶段检测可疑活动。通过分析历史数据和识别可疑行为模式,机器学习算法可以实时发现可疑交易,使组织能够迅速采取行动并防止财务损失。图数据库与机器学习一起成为欺诈检测的强大工具。图形数据库以高速率记录和分析网络交互,使其可用于各种应用,包括欺诈检测。他们可以识别大数据中的模式和关系,降低复杂性,以便检测算法可以有效地发现网络内的欺诈企图。机器学习如何提高欺诈预防能力机器学习在欺诈预防方面可以发挥重要作用,以下是一些提高欺诈预防能力的方法:数据分析和特征工程:使用机器学习技术对大量的交易数据进行分析和挖掘,发现欺诈模式和异常行为。通过特征工程,提取关键的特征用于建模。监督学习模型:使用监督学习算法,如决策树、逻辑回归、支持向量机(SVM)等,对历史数据进行建模,学习欺诈案例和正常交易之间的差异,并预测新的交易是否为欺诈。无监督学习模型:利用无监督学习算法,如聚类分析、异常检测等,发现数据中的潜在欺诈模式,识别与正常行为不同的异常交易。半监督学习:结合监督学习和无监督学习的优势,利用标记和未标记数据进行建模,提高模型的泛化能力和欺诈检测的效果。深度学习模型:使用深度学习技术,如神经网络,处理大规模数据,学习复杂的欺诈模式和特征表示,提高欺诈预测的准确性。模型集成:结合多个不同算法的预测结果,采用投票、加权平均等方法,提高模型的鲁棒性和预测性能。实时监测和反馈:建立实时监测系统,对交易进行及时监控和反馈,及时发现并阻止欺诈行为。持续优化:不断收集新数据,更新模型参数,优化模型性能,适应不断变化的欺诈手段和模式。总结总之,随着诈骗者不断发展其策略,组织必须调整其欺诈预防策略以有效应对这些威胁。机器学习和图形数据库是这场持续战斗中的强大武器。这些技术能够快速分析无数数据点,能够准确检测可疑活动,超越人类的能力。这类似于拥有一支超人欺诈侦探团队全天候不知疲倦地工作。转载自:cid:link_0
  • [技术干货] 下一代移动计算的预测
    前言随着技术以前所未有的速度发展,移动计算的未来有望实现变革性的进步。从增强的连接性到突破性的硬件创新,下一代移动计算将重新定义我们与数字世界互动的方式。本文将探讨预测移动计算发展轨迹的预测,并提供一些令人兴奋的可能性。预测5G革命性的连接无处不在的高速连接:5G网络的广泛实施有望通过提供无处不在的高速连接来彻底改变移动计算。这将为无缝流媒体、低延迟应用和沉浸式增强现实(AR)体验铺平道路。可折叠和灵活的显示重新定义形式因素:下一代移动设备可能会以可折叠和柔性显示屏为特色,为用户提供多种形式因素。这些创新可能会导致设备无缝地从传统智能手机转变为更大的平板电脑,甚至可以折叠成更紧凑的尺寸,以方便携带。个性化体验的AI集成智能和自适应助手:人工智能(AI)将在塑造移动计算的未来方面发挥关键作用。由人工智能驱动的智能和自适应助手将了解用户偏好,预测需求,并提供个性化体验,使与设备的交互更加直观和高效。扩展现实(XR)成为主流AR和VR集成:扩展现实(XR),包括增强现实(AR)和虚拟现实(VR),预计将成为移动计算的主流。从交互式AR应用到沉浸式VR体验,移动设备将成为数字参与新维度的门户。量子计算对移动安全的影响增强的安全协议:量子计算的出现可能会对移动安全产生重大影响。将实施抗量子算法和加密技术,以加强移动设备抵御新出现的威胁,确保用户数据的隐私和安全。设备设计中的环境可持续性环保材料和实践:下一代移动设备将在设计中优先考虑环境的可持续性。从使用环保材料到节能组件,制造商将越来越关注减少移动计算的生态足迹。生物识别认证的进步安全和无缝访问:面部识别和指纹扫描等生物识别身份验证将在准确性和速度方面取得进步。这些技术将为用户提供安全而无缝的设备和敏感信息访问。总结下一个移动计算时代即将迎来一波创新浪潮,这将重新定义我们连接、互动和体验数字世界的方式。从5G革命到人工智能和XR的集成,对移动计算未来的预测描绘了一个技术丰富和互联的未来。随着这些进步的展开,用户可以期待一种超越当前限制的移动体验,并开辟新的可能性领域。转载链接:cid:link_0