CrowdStrike的机器学习和threat graph 都是云端做的

https://www.crowdstrike.com/blog/big-data-graph-and-the-cloud-three-keys-to-stopping-todays-threats/

CS是提倡在云端用大数据做威胁图的,18年的时候就在提。

 

https://www.crowdstrike.com/resources/data-sheets/threat-graph/ 可以看其datasheet

设计并实现了CrowdStrike Threat Graph ™ 来存储、查询和分析相关的安全事件。Threat Graph 是一个基于云的、可大规模扩展的图形数据库,使 CrowdStrike 能够可视化和评估由我们的 Falcon 平台保护的数千个端点和云工作负载生成的大量事件数据。正是通过 Threat Graph,Falcon 获得了识别和阻止正在进行的攻击的能力。

 

https://www.crowdstrike.com/blog/how-crowdstrike-machine-learning-model-maximizes-detection-efficacy-using-the-cloud/

一种方法涉及在我们的云中累积数十亿个文件。这些文件来自各种来源,从受保护的环境到公共恶意软件集合,每天大约有 8600 万个新哈希值。该集合包括恶意代码、干净代码和不需要的代码,例如可能不需要的程序。 

为了构建我们的机器学习模型,我们从这个集合中仔细挑选干净和“脏”(即恶意)样本,从而生成一个标记集合,每个训练周期都会增加数千万个新示例。

提取正确的特征

为了确保生成的模型的质量,我们还从实时环境中收集感兴趣的文件,以最大限度地发挥模型的功效。虽然一些客户使用 Falcon 平台与我们共享文件,以便我们提高覆盖能力,但其他客户出于各种原因将他们的文件保留在内部。因此,要建立一个有效的模型,我们必须确保它能够在未与我们共享的内部文件以及已共享的文件上表现良好。但是,要训练机器学习模型,首先必须将这些文件简化为一长串转换后的数值,称为特征向量,代表文件的各种属性。 

作为人,我们使用我们的感官从周围环境中提取特征,然后根据过去的经验推断可能的结果。例如,如果外面多云并且有潮湿的微风,我们推断下雨的可能性很大,我们需要拿一把雨伞。在这种情况下,多云和潮湿可以被认为是描述下雨机会的特征向量的数据点的一部分。 

当然,文件的功能列表包含数千个人类无法阅读但我们的人工智能 (AI) 可以理解的十进制数字。该特征向量由 Falcon 传感器上传到云端,使我们能够通过对存储的特征向量运行预测来观察新模型对底层文件的看法。

图 1. 此流程描述了如何将特征向量和元数据发送到 CrowdStrike 安全云并用于我们的机器学习模型以帮助构建更好的预测

 

使用bert去检测恶意命令行:

https://www.crowdstrike.com/blog/bert-embeddings-new-approach-for-command-line-anomaly-detection/

https://www.crowdstrike.com/blog/bert-embeddings-new-approach-for-command-line-anomaly-detection-part-2/ 只是demo,做了实验,真正用起来的是传统ML

 

 

 

https://www.crowdstrike.com/blog/how-the-falcon-platform-modernizes-your-security-stack/

即构建一个由单个轻量级agent和通用云原生架构提供支持的大规模统一安全平台。

 

 

其ML文件检测使用了tensorflow?

 

CrowdStrike 如何使用 TensorFlow 和 Rust 实现闪电般的机器学习模型训练

https://www.crowdstrike.com/blog/how-crowdstrike-achieves-fast-machine-learning-model-training-with-tensorflow-and-rust/
 
  • CrowdStrike 将云的力量与 TensorFlow 和 Rust 等尖端技术相结合,使模型训练比传统方法快数百倍
  • CrowdStrike 不断提升机器学习能力,以树立行业标准,保护客户免受复杂威胁和对手的侵害

为CrowdStrike 的人工智能增压需要人类专业人员和正确的技术,以在 CrowdStrike Falcon ®传感器上占用很小的空间来提供极快、准确的机器学习模型训练。CrowdStrike 数据科学家不断探索理论和应用机器学习研究,以推进和设定行业标准,以保护客户免受复杂威胁和对手的侵害。

近年来,深度学习模型在各种机器学习任务中取得了令人难以置信的表现,尤其是在计算机视觉和自然语言处理领域。深度学习被主流采用的一个主要原因可以归功于强大的开源深度学习框架的兴起,其中最受欢迎的两个是 PyTorch 和 TensorFlow。这些框架提供了广泛的功能、文档和工具来构建机器学习模型。即使有这些优秀的资源,实施快速的端到端培训工作流程也可能具有挑战性。各种因素,包括使用的计算资源的类型和数据处理的实现方式,都会影响训练模型所需的时间。

在这里,我们分享了一些关于 CrowdStrike 最新文本分类模型之一的更快训练管道之旅的细节和见解。

构建初始 TensorFlow 训练管道

TensorFlow是一个功能强大的开源机器学习库,为在 Python 中构建机器学习模型提供了一个全面而灵活的生态系统。它提供了直观的高级 API (Keras) 和详尽的文档,其中包含有关如何开始构建模型训练管道的示例。 

模型开发的常见第一步是在本地机器上使用少量数据运行一个简单的模型训练工作流程,然后再扩展到对完整数据集进行训练。训练工作流程包括读取每个文件、处理数据(相当于我们用例的特征提取)、训练模型和评估模型结果。TensorFlow 的tf.data用于创建数据管道,因为它的 API 支持从简单且可重用的部分构建输入管道,并经过优化以读取数据并作为模型训练过程的一部分有效地进行转换。

图 1. 初始训练管道的简化视图

初始培训结果

使用端到端训练管道处理小型数据子集,是时候对完整的训练数据集进行训练了,该数据集由 190 万个文本文件和总计超过 70 GB 的数据组成。 

使用配备 32 GB CPU 内存和 2.3 GHz 8 核 Intel i9 处理器的 MacBook Pro,总训练需要 65 个 epoch 才能完成(机器学习中的一个 epoch 意味着一次完整的训练数据集传递)。每个 epoch 大约需要 3 小时 30 分钟,这导致总训练时间大约为 227 小时——超过 9 天!基于这些训练时间,加速模型训练的需求是显而易见的,因为超参数调整和特征实验需要更多的模型训练运行。

受过训练 训练数据集 总训练时间 总训练时间
MacBook Pro 笔记本电脑 190 万个文本文件 65 227 小时
 

使用 TensorBoard Profiler 分析我们的训练管道

除了 TensorFlow 提供的用于训练机器学习模型的综合 Python API 之外,它还提供了一个名为TensorBoard的强大工具,它具有直观的 Web 界面来帮助分析机器学习工作流程。

TensorBoard 支持分析器工具,可用于了解硬件资源消耗和机器学习模型中的各种 TensorFlow 操作。它支持指标和可视化,以帮助识别训练管道中的性能瓶颈。

 

图 2. TensorBoard 中的分析器工具(点击放大)

通过使用 TensorBoard 分析器,我们在训练管道中观察到CPU 上的数据预处理需要大量的处理时间。

使用 Rust 加速特征提取

管道的数据预处理部分,在这种情况下相当于特征提取,包括将文本文件读入内存,执行一些数据转换操作,并为每个文件输出一个整数特征向量。有机会通过用 Rust 替换 Python 实现来加速管道的特征提取部分。

Rust 编程语言和编译器在编译时确保程序的内存安全,而无需使用托管内存和垃圾收集器的开销。这对于编写安全代码至关重要,这些代码预计将在客户端计算机上以强大的内存和性能要求运行,同时处理不受信任和潜在的恶意数据。在 Rust 中实现特征提取 (FX) 逻辑后,然后对其进行编译,并将生成的库打包在 Python 包中。这个包可以很方便的导入到我们的 Python 代码中使用,替代了 Tensorflow 流水线中原有的 Python FX 代码。当使用 Rust FX Python 包时,会发生以下情况: 

  1. 该包采用 Python 中的输入数据。
  2. 它将输入数据传递给编译后的 Rust 库。
  3. 然后计算发生在机器代码中。
  4. 最后,将结果传递回 Python。 

该解决方案运行良好,因为它使用 Rust 编译库加快了特征提取操作,同时还可以通过简单的导入语句和函数调用轻松集成到现有 Python 代码中。

图 3. 用 Rust 替换 Python 特征提取代码

通过用 Rust 替换 Python 特征提取代码,总训练时间从 227 小时减少到 162 小时。

受过训练 训练数据集 总训练时间 总训练时间
MacBook Pro 笔记本电脑 190 万个文本文件 65 162 小时

支持 GPU 的模型训练

Amazon Web Services (AWS) 提供了种类繁多的 EC2 实例来支持不同的计算需求。P3 实例符合此用例的要求,因为 P3 实例具有 NVIDIA V100 Tensor Core GPU(GPU是一种专门的处理单元,可以执行快速数学运算,使其成为机器学习的理想选择)并使用CUDA进行设置,可以在 GPU 上加速 TensorFlow 模型训练。具体来说,一个p3.8xlarge实例拥有大量的 CPU 内存和多个 GPU,为加速模型训练提供了机会。

图 4. Amazon EC2 P3 实例产品详细信息(来源:https://aws.amazon.com/ec2/instance-types/p3/)

设置支持 GPU 的计算环境以与 TensorFlow 一起正常工作可能是一个具有挑战性的过程,因为它可能需要不平凡的修改和安装来解决操作系统、NVIDIA 驱动程序和 CUDA 库之间的版本不匹配问题。但是,使用 Docker 不需要对实例进行这些类型的修改。

Docker是一个开放平台,用于在基于容器的环境中开发、交付和运行应用程序,从而减少尝试直接在实例上设置应用程序依赖项的工作量和问题风险。具体来说,在 P3 实例上使用公共 TensorFlow-NVIDIA Docker 映像。在 Docker 环境中一切都按预期工作,不需要修改实例上的 NVIDIA 驱动程序或 CUDA 库。

图 5. 在基于容器的环境中使用 Docker

GPU 训练结果

正确配置 P3 实例后,只需将数据集和在 Mac 笔记本电脑上执行的相同 TensorFlow 代码复制到 P3 实例上,并在 Docker 容器上运行完整的模型训练管道。结果显示总训练时间有了很大的改进,从 163 小时缩短到 44 小时,因为 TensorFlow 代码通过在支持 GPU 的 P3 实例上运行来加速模型训练。

受过训练 训练数据集 总训练时间 总训练时间
p3.8xlarge 190 万个文本文件 65 44小时

优化 TensorFlow 数据性能的预取和缓存

除了通过在 GPU 上运行来加速训练之外,TensorFlow 还提供了配置选项,可以帮助构建更高效的数据管道,作为模型训练过程的一部分。tf.data API 提供两个重要的方法,可用于确保 I/O 在模型训练期间不会成为瓶颈:预取缓存

预取与训练时的数据预处理和模型执行重叠。具体来说,当模型在当前步骤执行训练时,输入管道会读取下一步的数据。预取转换通过利用重复工作的机会来减少总训练时间。

图 6. 预取数据性能(来源:https://www.tensorflow.org/guide/data_performance#prefetching)

缓存将数据从磁盘加载后保存在内存中。这确保了数据集在训练模型时不会成为瓶颈。需要注意的是,要在 TensorFlow 中优化缓存,计算机的总 CPU 内存应该大于训练数据集的总大小。

图 7. 缓存数据性能(来源:https://www.tensorflow.org/guide/data_performance#caching)

更新 TensorFlow 代码以在 tf.data API 中使用这些方法很简单:

train_dataset = train_dataset.cache().prefetch(buffer_size=tf.data.AUTOTUNE)

注意最佳元素数prefetch()应大于或等于单个训练步骤消耗的批次数。TensorFlow tf.dataAPI 提供了一个tf.data.AUTOTUNE标志,可用于在运行时动态调整预取值。

在应用这些更改并重新训练模型后,结果显示训练时间又大幅缩短,从 44 小时缩短到 6 小时。

受过训练 训练数据集 总训练时间 总训练时间 第一纪元训练时间 每个 Epoch 的平均训练时间 (2-65) 
p3.8xlarge 190 万个文本文件 65 6个小时 40 分钟  5分钟

请注意,第一个 epoch 之后的每个 epoch 都非常快。这是由于缓存。在第一个 epoch 期间,将整个训练数据集加载到 CPU 内存中,并对数据执行特征提取。对于所有后续 epoch,GPU 立即在已处理数据(特征向量)上的训练步骤上运行。

并行模型训练

除了拥有大量的 CPU 内存之外,在p3.8xlarge实例上运行的一个主要优势是它有四个 GPU。在实例上有多个 GPU 时,模型训练并行运行,每次运行都有一组不同的超参数。这通过使多个模型能够在同一个六小时窗口内进行训练,而不必等待每个模型训练运行完成后再启动下一个,从而减少了整个模型开发过程的时间。

图 8. 跨多个 GPU 的并行模型训练的简化视图。每个模型训练容器共享相同的 CPU 内存。请注意,仅使用了四个实例 GPU 中的三个。这是由于实例的可用于缓存的 CPU 内存总量相对于我们的训练数据集的大小的限制。

训练速度提升:数字之旅

图 9 显示了完全训练单个模型所需的时间,并与对训练工作流程的增量改进进行了比较:

图 9. 请注意,并行模型训练不包含在此图中,因为它不会影响单个模型的训练时间,即使它通过允许并行运行多次来缩短总模型开发时间。

我们可以看到,在通往更快模型训练管道的过程中,每次改进都会显着减少训练时间。

结论

为 TensorFlow 模型实现更快的模型训练所采取的步骤是:

  • 用 Rust 替换 Python 特征提取代码
  • 使用带有 Docker 的 AWS EC2 P3 实例来加速 GPU 上的模型训练
  • 向我们的 TensorFlow 代码添加缓存和预取
  • 并行运行多个模型训练,利用p3.8xlarge实例上可用的多个 GPU

这一更快的模型训练之旅为未来任何新的 TensorFlow 模型开发的加速训练提供了一个模板。

随着模型的训练和测试,它现在已准备好用于生产管道。CrowdStrike 开发了用于将 TensorFlow 模型转换为 Rust 的工具,使我们的模型能够在 CrowdStrike Falcon 传感器环境中以快速推理时间和小内存占用安全地使用。 

有关 CrowdStrike 如何将 TensorFlow 模型训练和 Rust 的优势结合起来进行模型推理的更多信息,请参阅在巨人的肩膀上构建:将 TensorFlow 和 Rust 结合起来以及将TensorFlow模型移植到纯 Rust 的开发成本

特别感谢 CrowdStrike 高级 Rust 软件工程师 Joey Hu 协助文章草稿审查和 Rust 特征提取工作。

参考

TensorFlow、TensorFlow 徽标和任何相关标记是 Google Inc. 的商标。

posted @ 2022-07-07 15:40  bonelee  阅读(387)  评论(0编辑  收藏  举报