图森未来-算法后端平台二面(pass)

2023-12-13 15:24:33 浏览数 (1)

哈喽~,大家好,我是千羽。

下面分享我认识的一位大佬华中科技大学985硕,图森未来-算法后端平台二面实习。


  • 1、动态链接与静态链接之间的区别?
  • 2、C 的中用什么管理项目,CMake或者Make,用CMake或者Make管理项目的好处?
  • 3、你认为DJL与Pytorch、Tensorflow之类的有什么区别?
  • 4、你认为如果要实现一个深度学习框架,有哪些要素是必须要实现的?
  • 5、TensorFlow与Pytorch的底层原理有了解吗?
  • 6、抖音项目有哪些亮点?
  • 7、为什么favorite接口要实现一个多层cache?
  • 8、假如后端服务宕机怎么办,你的redis异步写入与多层cache要怎么复原?
  • 9、为什么现在想要把抖音项目拓展为微服务?(又问?)

图森未来-算法后端平台二面(pass)

1、动态链接与静态链接之间的区别?

动态链接和静态链接是两种不同的链接方式,它们之间的主要区别在于代码的加载时间和内存使用方式。

  1. 加载时间:静态链接是在生成可执行文件的时候(链接阶段),把所有需要的函数的二进制代码都包含到可执行文件中去。因此,在程序发布的时候就不需要依赖库,程序可以独立执行。而动态链接则在编译的时候不直接拷贝可执行代码,而是通过记录一系列符号和参数,在程序运行或加载时将这些信息传递给操作系统,操作系统负责将需要的动态库加载到内存中,然后程序在运行到指定的代码时,去共享执行内存中已经加载的动态库可执行代码。
  2. 内存使用:静态链接的程序体积会相对大一些,如果静态库有更新的话,所有可执行文件都得重新链接才能用上新的静态库。而动态链接则允许多个程序共享同一段代码,而不需要在磁盘上存储多个拷贝。由于是运行时加载,可能会影响程序的前期执行性能。

2、C 的中用什么管理项目,CMake或者Make,用CMake或者Make管理项目的好处?

使用CMake或Make管理项目的优点包括:

  1. 自动化构建:CMake和Make都能自动化处理构建过程,减少了手动编写构建脚本的需求,使得项目构建更加便捷和高效。
  2. 跨平台支持:CMake具有跨平台特性,可以在不同的操作系统和编译器之间移植和构建项目。而Make也需要针对不同的平台和编译器手动编写构建脚本。
  3. 灵活性和可维护性:CMake使用CMakeLists.txt文件来描述构建过程,具有更高的灵活性和可维护性。CMake还提供了丰富的功能和工具,例如变量、条件判断、文件操作等,可以方便地处理复杂的构建逻辑。而Make使用Makefile文件描述构建过程,虽然也具有一定的灵活性,但相比CMake略显不足。
  4. 社区支持:CMake得到了广泛的社区支持,很多开源项目都使用了CMake作为构建工具,因此可以方便地找到相关的文档、教程和第三方库。而Make虽然也有一定的社区支持,但相比CMake略显不足。
  5. 集成测试工具:CMake可以方便地集成测试工具,例如Google Test、Catch2等,使得测试更加便捷和自动化。而Make则需要手动编写测试脚本。

3、你认为DJL与Pytorch、Tensorflow之类的有什么区别?

DJL(Deep Learning贾克斯)与Pytorch、Tensorflow的区别如下:

  1. 环境部署:DJL是在Amazon的AWS上进行深度学习模型训练的AI框架,它能够运行在多种类型的硬件上,包括CPU、GPU和TPU。而Tensorflow和PyTorch则主要在本地设备上运行,需要用户自行配置环境。
  2. 计算效率:DJL具有高效的计算能力,它采用分布式训练,可以快速地处理大规模的数据。而Tensorflow和PyTorch虽然也有分布式训练,但相对而言,它们的计算效率可能不如DJL。
  3. 易用性:DJL的API设计得相对简单易用,用户可以快速地构建和训练模型。而Tensorflow和PyTorch的API则相对复杂一些,可能需要更多的时间和精力去学习和掌握。
  4. 社区支持:Tensorflow和PyTorch都有庞大的社区支持,有大量的开源模型和代码可供参考和使用。而DJL的社区相对较小,可能没有那么多现成的模型和代码可以使用。
  5. 模型部署:DJL提供了自动化的模型部署功能,可以将训练好的模型快速地部署到云端或者本地设备上。而Tensorflow和PyTorch则需要用户自行部署模型。

4、你认为如果要实现一个深度学习框架,有哪些要素是必须要实现的?

要实现一个深度学习框架,以下要素是必须要实现的:

  1. 计算图:深度学习框架需要提供计算图的功能,计算图描述了模型中各个节点之间的关系和依赖性。框架需要能够创建、优化和执行计算图,以实现高效的计算和内存管理。
  2. 张量计算:深度学习框架需要提供张量计算的功能,包括张量的创建、索引、切片、扩展和合并等操作。这些操作是构建神经网络的基础。
  3. 模型训练:深度学习框架需要提供模型训练的功能,包括前向传播、反向传播、梯度下降等操作。框架还需要支持不同的优化器和损失函数,以便用户能够根据不同的应用场景进行选择。
  4. 数据加载和处理:深度学习框架需要提供数据加载和处理的功能,包括读取数据、预处理数据、数据增强等操作。这些功能对于构建和训练模型至关重要。
  5. 分布式训练:深度学习框架需要支持分布式训练,以便在大规模数据集上进行高效的计算。框架需要实现数据并行和模型并行等技术,以实现高效的分布式训练。
  6. 模型保存和加载:深度学习框架需要提供模型保存和加载的功能,以便用户能够将训练好的模型保存到磁盘上,并在需要时加载模型进行推理或重新训练。
  7. 可视化工具:深度学习框架需要提供可视化工具,以便用户能够方便地查看和理解模型的结构和训练过程。可视化工具可以帮助用户更好地理解模型、调试模型和优化模型。
  8. 硬件支持:深度学习框架需要支持不同的硬件平台,包括CPU、GPU和TPU等。硬件支持可以让用户根据不同的需求选择合适的硬件进行模型训练和推理。

5、TensorFlow与Pytorch的底层原理有了解吗?

TensorFlow和PyTorch的底层原理都是基于深度学习框架的基本构成要素进行设计的,但两者在具体实现上有所不同。

TensorFlow的底层原理主要基于静态图构图,它在搭建框架时没有真正的数据传递,设计模型和运行模型、传递数据是分开的。在TensorFlow中,首先定义一个用来计算的图(可以简称为计算图),然后TensorFlow就会使用这个图进行运算,最后输出运算结果。由于其底层使用C 语言开发,因此具有高效的计算能力。此外,TensorFlow还支持分布式训练,可以将庞大的计算任务分解成每一小部分在一台计算机上,成百上千台计算机同时运算,将每一天计算机运算的结果汇总,就得到了要计算的结果。

PyTorch的底层原理基于动态图构图,可以理解为设计模型和运行模型、传递数据是同步进行的。PyTorch采用动态图的方式建立模型,可以在模型训练过程中动态地调整计算图的结构和参数。PyTorch的底层使用Python语言开发,因此其API封装的更为完善,提供了更加灵活和易用的接口。此外,PyTorch也支持分布式训练,并提供了丰富的预训练模型和工具包,方便用户快速构建和训练模型。

总之,TensorFlow和PyTorch的底层原理都是基于深度学习框架的基本构成要素进行设计的,但两者在具体实现上有所不同。

6、抖音项目有哪些亮点?

7、为什么favorite接口要实现一个多层cache?

增加cache可以带来以下好处:

  1. 提高缓存命中率:通过将数据存储在多个缓存级别中,可以增加缓存命中率,减少直接从主存中读取数据的次数,从而提高程序的执行效率。
  2. 减少CPU等待时间:CPU在访问主存时需要等待较长时间,而多层cache可以减少CPU等待时间,提高CPU的利用率。
  3. 优化数据访问局部性:多层cache可以通过优化数据访问局部性来提高程序的性能。局部性是指程序在访问数据时倾向于访问相邻的地址,这种趋势可以被多层cache利用,将数据按照访问顺序分级存储,从而减少缓存未命中次数。

8、假如后端服务宕机怎么办,你的redis异步写入与多层cache要怎么复原?

  1. 对于redis异步写入,可以在前端页面上先进行本地缓存,然后通过异步方式写入redis中。由于redis具有持久化功能,即使后端服务宕机,也可以将数据从redis中恢复出来。
  2. 对于多层cache,可以在nginx中编写业务逻辑,实现nginx本地缓存、Redis查询、Tomcat查询的业务逻辑。当后端服务宕机时,nginx可以优先查询本地缓存和Redis,如果未命中,则查询Tomcat。在Tomcat中,可以实现JVM进程缓存,从而尽可能地避免对数据库的查询。

9、为什么现在想要把抖音项目拓展为微服务?(又问?)

将抖音项目拓展为微服务的原因有以下几点:

  1. 业务需求变化:随着业务的发展,抖音项目的复杂度逐渐增加,原有的单体应用架构已经无法满足业务需求。因此,需要将原有的单体应用拆分为多个微服务,以实现业务功能的解耦和独立部署。
  2. 提高可伸缩性:微服务架构可以更好地支持分布式部署,使得抖音项目可以在不同的服务器或容器中运行,从而提高系统的可伸缩性和性能。
  3. 提高可维护性:微服务架构将应用程序拆分为多个独立的的服务,每个服务都可以独立地运行和更新。这使得代码库更容易理解和维护,因为每个服务的功能都是相对独立的。
  4. 提高开发效率:微服务架构支持快速迭代和开发,每个微服务都可以独立地进行开发、测试和部署,从而提高了开发效率。
  5. 适应云原生环境:云原生环境是现代应用程序开发和部署的重要趋势。微服务架构可以更好地适应云原生环境,支持容器化部署、自动化运维、动态扩缩容等特性。
  • 原文链接:https://github.com/warthecatalyst/What-to-in-Graduate-School/blob/main/秋招的面经/华科计科第二人的秋招报告.md

0 人点赞