当前位置: 首页 > 编程日记 > 正文

自动驾驶人的福音!Lyft公开Level 5部署平台Flexo细节

640?wx_fmt=jpeg


作者 | Mathias Gug等,Lyft Level 5 软件工程师

译者 | Lucy

编辑 | 夕颜

出品 | AI科技大本营(ID:rgznai100)

              
导读:经过一年半的 bootstrapping(一种再抽样统计方法),Lyft 让 Level 5 实现区分非常相似,但又不完全相同的两辆汽车。Level 5 是自动驾驶等级分类的最高级别,可以实现完全自动驾驶,由车辆完成所有驾驶操作,人类驾驶员不需要集中注意力,不限定道路和环境。
Lyft 的工程师和操作人员花费大量的时间了解每辆车的微妙差异和独特环境。从云计算模块开始,Lyft 构建了一个名为 Flexo 的汽车部署平台,以确保能自动构建车队软件,并为每个自动驾驶汽车(AV)部署相同的环境。如今,每辆汽车都使用相同的磁盘映像,工程师和操作人员都拥有稳定的工作环境。 本文介绍了这款 Level 5 自动驾驶部署平台的构建过程和技术细节。

640?wx_fmt=png
挑战


在 Level 5 中,硬件团队会在内部运营自己的 AV 车队。由于现在 AV 发展仍处于初期阶段,因此车队必须提供两种截然不同的用例。一个是运营团队执行诸如班车服务和数据收集等任务的稳定平台,另一个则是为不断改进堆栈的软件工程师的开发平台。这两组用户的要求完全不同:运营团队需要具有最少选项和高度可预测行为的一站式设备平台,而工程师需要最大的灵活性,以便他们可以快速迭代。 作者从一个基于 Salt 的简单配置管理系统开始,该系统根据需要车辆的用户类型配置车辆。操作方法是首先复制该软件,在汽车中重新配置高性能计算机(HPC),并从源代码构建。同样,工程师可以根据自己的需要提取分支,构建和重新配置 HPC。这种方法因为开发很早,汽车不会被频繁使用,在早期汽车数量不多的时候能正常工作,可以使用汽车 HPC 来构建软件堆栈。随着 AV 车队扩大规模,软件堆栈复杂性增加,每当任务类型发生变化时,就会浪费大量时间来重新配置和构建数十辆汽车。显然,该方法还有待提升! 


磁盘交换与网络传输


在研发 Level 5 车辆早期,作者讨论了磁盘交换与网络连接在删除记录传感器数据方面的优缺点。 根据每天每台车发送数据大小作者选择了磁盘交换。选择该方法的原因有很多,包括高速以太网电缆和连接器的机械刚性,以及无法保证车库中的高速网络端口。最重要的是,车辆的周转时间对车队的生产率至关重要。我们可以在任何地方在 30 秒内更换驱动器,但使用 50 Gbps 以太网连接回收 4TB 的驱动器需要大约 10 分钟。此外,车库可以快速建造并移动到任何位置。由于磁盘可以邮寄,因此对高速网络并不是一项硬性要求。 这就是作者采用一种流程来交换数据驱动器进出汽车的原因。作者采用类似的方法在启动驱动器上部署软件。 


解决方案

简而言之,Flexo 构建了引导驱动器。这是一个硬件和软件解决方案,可以使用完整的软件刻录数十个相同的硬盘,从 Linux 引导加载程序到每天构建的自动驾驶汽车软件的特定版本,并为任务类型设置配置信息。 在高层次上,Flexo 是一个标准的 Ubuntu 18.04 服务器系统,使用以下方法构建:
  • 用于构建图像的 Docker
  • 用于刻录图像的 systemd 单元
  • 用于构建和管理图像的 Python 脚本
  • 把所有模块连在一起的 BASH
  • 用于监控 Telegraf 和 Wavefront 
       640?wx_fmt=png        Flexo 示意图 Flexo 部署平台将 git 存储库中托管的源代码转换为可以在 AV 计算机上引导的磁盘映像。其可以分解为以下功能组件:
  • 图像构建器:负责从存储在 git 存储库中的源代码构建可启动文件系统
  • 图像刻录机:采用这些可引导文件系统并将它们刻录到多个硬盘驱动器上
  • 图像选择器:选择要在汽车上启动的图像
  • 覆盖根:提供短暂的根文件系统
  • 硬件平台:此系统运行的车辆 


图像构建器

Flexo 的主要任务是构建和管理图像。图像只是完整可启动文件系统的tar压缩存档,然后使用图像刻录机来刻录启动驱动器。这些图像通常约为 100 多 GB,因为图像中包括高清(HD)地图。Lyft 已使用容器多年,因此选择 Docker 作为构建图像的自然选择工具。Docker 定义了一种成熟且灵活的语言和工具链,用于构建容器图像。在用例中,作者只使用 Docker 作为构建映像的工具,而不运行 Docker。因此,作者需要手动安装引导加载程序(grub),内核及容器内的初始虚拟内存盘。 作者使用几种不同的 Dockerfiles,具体取决于对图像的配置。下面是文中使用的 Dockerfiles 的大致内容:
  1. 从标准的 Ubuntu 16.04 docker 镜像开始

  2. 安装一个 linux 内核和 grub,以便映像可以在裸机上启动(docker 镜像没有内核,因为容器在运行时与主机共享内核)。

  3. 复制相关软件存储库

  4. 具体而言,使用 SaltStack 配置文件系统进行所需的配置

  5. 设置用户和权限

  6. 安装所有需要的 Ubuntu 软件包

  7. 安装和配置 systemd 单元和 udev 规则以查找车辆特定数据(见下文)

  8. 安装系统构建依赖项

  9. 根据设置配置项构建自己的软件

  10. 将图像导出为 tar 文件

 现在,发布经理通常只要批准了新版本的生产用途,就会手动开始构建图像。作者正在寻找方法将这一过程标准化。由于使用了容器技术,映像构建组件与其运行的主机分离。


车辆特有数据


图像构建完全与车辆无关,因为从硬件角度来看,同代的所有车辆都是相同的,甚至在运行时也会处理代际差异。但是,作者需要保留一些车辆特有的数据,包括车辆的身份(以便跟踪记录的数据和日志),加密密钥和证书以及校准参数。由于 Flexo 创建的启动驱动器都可以安装到任何车辆中,因此添加了永远不会以 USB 记忆棒的形式从汽车中移除的本地存储。 


图像刻录机


映像刻录机组件负责将可启动文件系统构建到多个硬盘驱动器上。该组件需要处理 20 多个硬盘驱动器,这些硬盘驱动器在系统打开时由操作员插入和拔出。        640?wx_fmt=png       每个硬盘驱动器由唯一的 sync_all_image_to_disk @ sd * systemd 单元管理。鉴于可以随时添加和删除硬盘驱动器,作者利用 udev-- Linux 内核使用的通用设备管理器,支持 udev 而不是cron 作业,以便作者可以在插入磁盘后立即启动图像刻录过程。作者使用 udev 规则为每个硬盘驱动器启动系统作业: ENV{DEVTYPE}==”disk”, ENV{ID_PART_TABLE_UUID}==”00000000-*”, TAG+=”systemd”,     ENV{SYSTEMD_WANTS}+=”sync_all_images_to_disk@$kernel.service” 该规则使用 $ kernel udev 替换 systemd 单元实例到硬盘设备路径。systemd 单元通过 %i 标识符将设备路径传递给 sync_all_images_to_disk 脚本: ExecStart=/usr/local/bin/sync_all_images_to_disk /dev/%i 这意味着刻录过程与构建过程完全分离,是在插入驱动器时启动的。作者为操作员创建了一种精简的方式来判断何时准备就绪,这在下面的硬件部分中有所概述。当作者开发系统时,擦除了Flexo 系统本身的 O / S 驱动器,标记 Flexo 应该使用的硬盘。每个 Flexo 驱动器都有一个以 00000000 开头的磁盘 GUID。udev 规则使用基于 ID_PART_TABLE_UUID 环境变量的附加过滤器,仅为标记为 Flexo 驱动器的磁盘启动 sync_all_images_to_disk @作业: ENV{ID_PART_TABLE_UUID}==”00000000-*” 标记驱动器也有助于解决操作员的操作错误。如果错误插入非 Flexo 驱动器,则不会覆盖该驱动器。


图像选择器和启动盘结构


每个 Flexo 硬盘驱动器都支持多个版本的完整软件堆栈。作者使用 GRUB 作为操作员的主要 UI,以便在任务开始时选择要引导的映像:      640?wx_fmt=png       主 GRUB 配置维护硬盘驱动器的每个分区中可用的映像列表。每个映像都提供带有内核和初始虚拟内存盘配置的辅助 GRUB 引导加载程序。图像从主引导加载程序链式加载,尽可能地分离每个图像。并且一个映像中的错误配置不会影响硬盘驱动器的其他映像。       640?wx_fmt=png       从上图中可以看出,每种分区类型都使用 UUID 前缀来指示它是什么类型的分区。作者还为文件系统添加了 UUID 前缀。值得注意的是,让 Flexo 的这部分稳定是非常耗时的。今天的图像刻录机流程不到 1000 行 BASH,但是每一行都需要做很多工作才能做到正确,因为这些低级工具的文档记录性能很差,相关论坛和博客也不多。 例如,Linux 支持动态安装文件系统,因为我们在每个驱动器上创建多达 12 个分区,而系统中最多有 24 个驱动器,而为了保持内核始终是最新的,会导致内核和系统级别的大量资源争用。作者不得不使用大量的读/写锁,并在最终变得稳定之前对 partprobe 进行显式调用以更新内核的新分区视图。 


防止漂移:overlayroot


作者在设计 Flexo 之前遇到的一个痛点是,每个启动盘的状态会随着时间的推移而漂移,因为启动盘将留在车内并由连续的任务重用。而要完成本文中的任务,必须要将之前的任务清除,以便之前的任务不会对下一个任务产生影响。为此,作者使用 overlayroot 包在现有图像的顶部提供可写层。硬盘驱动器上的覆盖分区用作在运行时存储图像更改的临时位置。作者使用带有随机密码的 crypt 后端来确保在重新启动时擦除实时系统期间所做的任何更改。对于所有操作目标图像,GRUB 配置中的 overlayroot 设置已打开:overlayroot=”crypt:dev=/dev/disk/by-partuuid/55555555-<DISK_ID>-555555555555,mkfs=1,fstype=ext4,recurse=0" 此功能与操作团队总是在任务之间重新启动计算机的指令相结合,大大减少了工程师花在支持运营团队上的时间。 


用kvm测试图像


在开发 Flexo 系统时,作者很快意识到将硬盘从一个系统移动到另一个系统进行测试会导致迭代周期延长。作者开始利用 kvm 和 OVMF 来加速开发。OVMF提供类似于汽车中的计算机的UEFI bios。此虚拟化测试环境还包括用于汽车标识的本地 USB 驱动器。通过类似于以下的 kvm 命令启动给定硬盘驱动器的测试环境:
kvm -m 4096 -bios OVMF.fd -drive format=raw,file=/dev/sdk -drive format=raw,file=”car_data.img” — vnc :59 作者可以测试从 BIOS 到 Flexo 系统本身的 AV 软件堆栈(包括图形部分)的实际启动的完整启动顺序。甚至可以包括车辆特定USB记忆棒的虚拟版本(上面的 car_data.img)。并非所有项都能在 VM 中正确启动,但足以验证大多数系统设置。 


硬件


由于每辆车至少需要一个启动盘(作者通常会保留多个启动盘,以便在一个启动盘在使用时不必等待新的启动盘),每个 Flexo 系统都是标准的机架式服务器,有 24 个驱动器托架,允许批量交换驱动器,并为每个存放汽车的站点保留了几个系统。 I / O 吞吐量是最重要的指标。将整个工作集保存在 RAM 中对于高速刻录磁盘至关重要,因此作者为 Flexo 计算机提供尽可能多的 RAM。由于 Flexo 系统的磁盘刻录部分是自运行的,作者使用 ledmon 来控制机箱 LED 以指示磁盘状态。插入磁盘后,LED 会变暗,然后在刻录过程中开始快速闪烁。最后,亮红灯表示驱动器已准备好被取出并移动到车辆上。 


简化工作流程以缩短反馈循环


Lyft 所有的汽车和 AV 运营商现在都在使用 Flexo 部署平台。由于可启动图像完全可工作,任务启动时间大幅减少,开发人员也不再对 O / S 的状态存疑。稳定的环境使得其在故障排除过程中可以减少变化因素。 


下一步


随着车队的扩展,Flexo 部署平台将部署到多个系统。Lyft 正在考虑将图像构建器组件移动到云端,以确保所有 Flexo 系统中的图像都相同。Lyft 还希望扩展 Flexo,使其能够为特定开发人员构建映像,并在云中不断测试映像。在加速开发循环并尽可能快地向开发人员提供反馈方面,Flexo 部署流程将发挥关键作用。
原文链接:https://medium.com/lyftlevel5/flexo-a-car-deployment-platform-a8dafc79b4ca

(*本文为 AI科技大本营翻译文章,转载请联系微信 1092722531)


社群福利

扫码添加小助手,回复:大会,加入2019 AI开发者大会福利群,每周一、三、五更新技术福利,还有不定期的抽奖活动~

640?wx_fmt=jpeg


精彩推荐



640?wx_fmt=jpeg


60+技术大咖与你相约 2019 AI ProCon!大会早鸟票已售罄,优惠票速抢进行中......2019 AI开发者大会将于9月6日-7日在北京举行,这一届AI开发者大会有哪些亮点?一线公司的大牛们都在关注什么?AI行业的风向是什么?2019 AI开发者大会,倾听大牛分享,聚焦技术实践,和万千开发者共成长。


推荐阅读

  • 通俗易懂:图解10大CNN网络架构

  • AI+DevOps正当时

  • 5天破10亿的哪吒,为啥这么火,Python来分析

  • 5G+AI重新定义生老病死

  • 北上深人均月薪超 2 万元,清华近三成毕业生年入 50 万+,5G 人才月薪超 4 万

  • 如何从零开始设计一颗芯片?

  • 在其他国家被揭穿骗子又盯上非洲? 这几个骗子公司可把非洲人民坑苦了…

  • 国内首款 5G 机型开售;Google Chrome 大部分插件无人用;Firefox 69 Beta 9 发布 | 极客头条

640?wx_fmt=png你点的每个“在看”,我都认真当成了喜欢


相关文章:

Cygwin的安装及在Android jni中的简单使用举例

Cygwin是一个在windows平台上运行的类UNIX模拟环境&#xff0c;是cygnussolutions公司开发的自由软件。Cygwin是许多自由软件的集合&#xff0c;Cygwin的主要目的是通过重新编译&#xff0c;将POSIX系统上的软件移植到Windows上。Cygwin包括了一套库&#xff0c;该库在win32系统…

university, school, college, department, institute的区别

这些个词没有太大区别&#xff0c;有时候有些词是可以通用的&#xff0c;而有些用法则是随着地域时间的不同而变迁。一般说来&#xff0c;college译作“学院”&#xff0c;它是university &#xff08;综合性大学&#xff09;的一个组成部分&#xff0c;例如&#xff0c;一所综…

XML简介及举例

可扩展标记语言(eXtensibleMarkup Language&#xff0c;简称XML)&#xff0c;是一种标记语言。标记指计算机所能理解的信息符号&#xff0c;通过此种标记&#xff0c;计算机之间可以处理包含各种信息的文章等。如何定义这些标记&#xff0c;既可以选择国际通用的标记语言&#…

关于事务的传播特性和隔离级别的问题

REQUIRED&#xff1a;业务方法需要在一个事务中运行。如果方法运行时&#xff0c;已经处在一个事务中&#xff0c;那么加入到该事务&#xff0c;否则为自己创建一个新的事务。 NOT_SUPPORTED&#xff1a;声明方法不需要事务。如果方法没有关联到一个事务&#xff0c;容器不会为…

[Big Data - Kafka] kafka学习笔记:知识点整理

一、为什么需要消息系统 1.解耦&#xff1a; 允许你独立的扩展或修改两边的处理过程&#xff0c;只要确保它们遵守同样的接口约束。 2.冗余&#xff1a;消息队列把数据进行持久化直到它们已经被完全处理&#xff0c;通过这一方式规避了数据丢失风险。许多消息队列所采用的&q…

自然语言处理十问!独家福利

最近&#xff0c;NLP 圈简直不要太热闹&#xff01;预训练模型频频刷新榜单&#xff0c;让一众研究者、开发者“痛并快乐着”。自 2018 年 10 月&#xff0c;Google 提出 BERT 以来&#xff0c;NLP 领域预训练模型的发展仿佛坐上了火箭&#xff0c;完全控制不住。BERT 出世前&a…

BERT的成功是否依赖于虚假相关的统计线索?

作者 | 李理来源 | 个人博客导读&#xff1a;本文介绍论文Probing Neural Network Comprehension of Natural Language Arguments&#xff0c;讨论BERT在ACRT任务下的成绩是否依赖虚假的统计线索&#xff0c;同时分享一些个人对目前机器学习尤其是自然语言理解的看法。目录论文…

【电子基础】模拟电路问答

模拟电路基础知识问答整理 mystery 1、温度对半导体材料的导电性能有什么影响? 答&#xff1a;温度对半导体的导电性能有很大影响。当温度升高时&#xff0c;半导体材料内的自由电子和空穴数量迅速增加&#xff0c;半导体的导电性能将迅速提高。 2、什么是本征半导体和杂质半导…

XML解析简介及Xerces-C++简单使用举例

XML是由World WideWeb联盟(W3C)定义的元语言。它已经成为一种通用的数据交换格式&#xff0c;它的平台无关性&#xff0c;语言无关性&#xff0c;系统无关性&#xff0c;给数据集成与交互带来了极大的方便。XML在不同的语言里解析方式都是一样的&#xff0c;只不过实现的语法不…

[干货]Kaggle热门 | 用一个框架解决所有机器学习难题

新智元推荐 来源&#xff1a;LinkedIn 作者&#xff1a;Abhishek Thakur 译者&#xff1a;弗格森 【新智元导读】本文是数据科学家Abhishek Thakur发表的Kaggle热门文章。作者总结了自己参加100多场机器学习竞赛的经验&#xff0c;主要从模型框架方面阐述了机器学习过程中可能会…

gtest简介及简单使用

gtest是一个跨平台(Liunx、Mac OS X、Windows、Cygwin、Windows CE and Symbian)的C测试框架&#xff0c;有google公司发布。gtest测试框架是在不同平台上为编写C测试而生成的。从http://code.google.com/p/googletest/downloads/detail?namegtest-1.7.0.zip&can2&q下…

新浪微博推广网站的一些实践体会

本以为微博推广很难&#xff0c;每天都要刷粉刷内容的&#xff0c;也本以为做微博推广也很简单&#xff0c;一不卖产品、二不卖服务的&#xff0c;目的单纯灵活性强些&#xff0c;做了之后才发现都不是那么回事&#xff0c;微博虽然也过了“火了”&#xff0c;但新媒体还真是不…

AI和大数据如何落地智能城市?京东城市这6篇论文必读 | KDD 2019

来源 | 京东城市&#xff08;ID: icity-jd&#xff09;作为世界数据挖掘领域的最高级别的学术会议&#xff0c;ACM SIGKDD&#xff08;国际数据挖掘与知识发现大会&#xff0c;简称 KDD&#xff09;将于 2019 年 8 月 4 日—8 日在美国阿拉斯加州安克雷奇市举行。自 1995 年以来…

OSError: Could not find library geos_c or load any of its variants ['libgeos_c.so.1', 'libgeos_c.so

OSError: Could not find library geos_c or load any of its variants [libgeos_c.so.1, libgeos_c.so 解决&#xff1a; sudo vim /etc/ld.so.conf 添加&#xff1a;/opt/source/geos-3.5.0/build/lib sudo ldconfig

五分钟搭建BERT服务,实现1000+QPS​,这个Service-Streamer做到了

作者 | 刘欣简介&#xff1a;刘欣&#xff0c;Meteorix&#xff0c;毕业于华中科技大学&#xff0c;前网易游戏技术总监&#xff0c;现任香侬科技算法架构负责人。之前专注游戏引擎工具架构和自动化领域&#xff0c;2018年在GDC和GoogleIO开源Airtest自动化框架&#xff0c;广泛…

Nagios+pnp4nagios+rrdtool 安装配置为nagios添加自定义插件(三)

nagios博大精深&#xff0c;可以以shell、perl等语句为nagios写插件&#xff0c;来满足自己监控的需要。本文写mysql中tps、qps的插件&#xff0c;并把收集到的结果以图形形式展现出来&#xff0c;这样输出的结果就有一定的要求了。 编写插件tps qps check_qps 插件如下内容 #…

OpenSSL简介及在Windows、Linux、Mac系统上的编译步骤

OpenSSL介绍&#xff1a;OpenSSL是一个强大的安全套接字层密码库&#xff0c;囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议&#xff0c;并提供丰富的应用程序供测试或其它目的使用。 SSL是SecureSockets Layer(安全套接层协议)的缩写&#xff0c;可以在Interne…

Guava Cache本地缓存在 Spring Boot应用中的实践

概述 在如今高并发的互联网应用中&#xff0c;缓存的地位举足轻重&#xff0c;对提升程序性能帮助不小。而 3.x开始的 Spring也引入了对 Cache的支持&#xff0c;那对于如今发展得如火如荼的 Spring Boot来说自然也是支持缓存特性的。当然 Spring Boot默认使用的是 SimpleCache…

Windows 8.1 Preview(Windows Blue)预览版简体中文官方下载(ISO完整版镜像)

Windows 8.1是微软继Windows 8以来的又一全新力作&#xff0c;又名Windows Blue&#xff08;视窗蓝&#xff0c;专注蓝屏30年&#xff09;&#xff0c;个人觉得Win8还是比较流畅的但大众始终觉得还是有很多需要改进或者改善的&#xff0c;如今微软为了迎合大众需求对Win8进行升…

Linux下编辑器vi/vim的使用介绍

vi编辑器是所有Unix及Linux系统下标准的编辑器。对Unix及Linux系统的任何版本&#xff0c;vi编辑器是完全相同的。 基本上vi可以分为三种状态&#xff0c;分别是命令模式(commandmode)、插入模式(insert mode)和底行模式(last line mode)&#xff0c;各模式的功能为&#xff1…

Clojure程序设计

《Clojure程序设计》基本信息作者&#xff1a; (美)Stuart Halloway Aaron Bedra [作译者介绍]出版社&#xff1a;人民邮电出版社ISBN&#xff1a;9787115308474上架时间&#xff1a;2013-3-1出版日期&#xff1a;2013 年3月开本&#xff1a;16开页码&#xff1a;230版次&#…

重磅!AI Top 30+案例评选正式启动

2019 年&#xff0c;人工智能应用落地的重要性正在逐步得到验证&#xff0c;这是关乎企业生死攸关的一环。科技巨头、AI 独角兽还有起于草莽的创业公司在各领域进行着一场多方角斗。进行平台布局的科技巨头们&#xff0c;正在加快承载企业部署 AI 应用的步伐&#xff0c;曾经无…

直播回顾 | 关于Apollo 5.0控制在环仿真技术的分享

Apollo 用于模型验证和测试的基于 Web 的仿真平台 Dreamland 已经更新到能使用更强大的场景编辑器和环控制模拟。基于 Apollo 流水线和机器学习的动力学模型&#xff0c;复杂度较高&#xff0c;同时基于 AI 的全景数据建模&#xff0c;模型精细度高&#xff0c;误差比传统方式可…

eclipes 安装 pytdev,svn,插件

1&#xff0c; python pydevhttp://pydev.org/updates2, svnhttp://subclipse.tigris.org/update3, 推荐http://subclipse.tigris.org/update_1.10.x 转载于:https://blog.51cto.com/swq499809608/1240873

FFmpeg简介及在vc2010下编译步骤

FFmpeg是一个开源的多媒体库&#xff0c;最新版本是2.4.3&#xff0c;它的License是LGPL或GPL。FFmpeg可以用来记录、转换数字音频、视频&#xff0c;并能将其转换为流的开源计算机程序。它包括了音/视频编码库libavcodec。FFmpeg是在Linux下开发出来的&#xff0c;但它可以在包…

医院六级电子病历建设思路及要点

产生背景 在医院电子病历信息化发展的过程中&#xff0c;先后经历了纸质病历、电子病历、结构化电子病历以及具有全医疗过程管理能力的电子病历四个阶段。临床业务需求质量的逐步提升&#xff0c;标准规范的逐步细化&#xff0c;互联网战略的落地实施&#xff0c;无疑对目前电子…

上手必备!不可错过的TensorFlow、PyTorch和Keras样例资源

作者 | 黄海广来源 | 机器学习初学者&#xff08;ID: ai-start-com&#xff09;TensorFlow、Keras和PyTorch是目前深度学习的主要框架&#xff0c;也是入门深度学习必须掌握的三大框架&#xff0c;但是官方文档相对内容较多&#xff0c;初学者往往无从下手。本人从github里搜到…

Linux下gdb调试工具的使用

gdb是GNU开源组织发布的一个强大的Linux下的程序调试工具。 gdb主要完成四个方面的功能&#xff1a;(1)、启动你的程序&#xff0c;可以按照你的自定义的要求随心所欲的运行程序&#xff1b;(2)、可让被调试的程序在你所指定的调试的断点处停住(断点可以是条件表达式)&#xf…

UESTC 1726 整数划分(母函数)

题目链接&#xff1a;http://222.197.181.5/problem.php?pid1726 题意&#xff1a;求n的划分数。一种划分方案中不能有相同的数字。 思路&#xff1a;(1x)(1x^2)(1x^3)……(1x^1000). int f[N];void init() {f[1]1;int a[N]{0};a[0]1; a[1]1;int i,j;for(i2;i<1000;i){for(…

JS nodeType返回类型

JS nodeType返回类型 前几天朋友正好问道 这个 js的nodeType是个什么概念&#xff08;做浏览器底层的&#xff09;正好遇到这篇文章可以向大家解释下 将HTML DOM中几个容易常用的属性做下记录&#xff1a; nodeName、nodeValue 以及 nodeType 包含有关于节点的信息。 nodeName …