本文正在参加「金石计划 . 瓜分6万现金大奖」
前言
随着互联网的繁荣和发展,海量的核心数据和网络应用也不断向云端、数据中心等关键信息基础设施整合和迁移,主机安全也因此成为网络攻防战的焦点。恶意文件 是指由攻击者专门设计的,在未经所有者许可的情况下用来访问计算机、损害或破坏系统,对保密性、完整性或可用性进行攻击的文件,是当前互联网安全的主要威胁之一。目前,比较主流的恶意文件包括恶意脚本、漏洞利用、蠕虫、木马和间谍软件以及他们的组合或变体。
为了应对挑战,恶意文件静态检测的思想被提了出来。基于机器学习算法的防护技术为实现高准确率、自动化的未知恶意文件检测提供了行之有效的技术途径,已逐渐成为业内研究的热点。
接下来博主将简单介绍其中一种恶意文件静态检测模型的部分内容;
番外:对于想了解梯度下降算法的小伙伴,也可以看看博主的往期博文:
分析
这里的恶意文件静态检测是将恶意文件的二进制转成灰度图,作为 CNN 模型的输入,经过一系列的过程得到输出,然后进行对比、评估等;
考虑到每个样本的大小是不固定的,本来是以 1M 大小作为区分界限的,这里的话,使用 PadSequence
来确保数据长度的一致性;
1 | py复制代码class PadSequence(object): |
然后进行数据加载:
1 | py复制代码with open(path, 'rb') as f: |
最后进入模型进行训练以及验证;
TIP
在模型训练中,可以使用 try...excpet
模块,即使因为意外中断训练,之前的训练结果也都保存下来了,下次训练就不用重头开始了:
1 | py复制代码try: |
问题解决
OOM
在启动项目时,可能会出现以下报错:
1 | sql复制代码(sid10t) bash-4.2# python model_run.py |
这是因为我们将 DataLoader
里的 batch_size
参数设置的过大了,从而导致了显存溢出;
那么无非就是两个解决方案:
- 多选定几个 CUDA;
- 将
batch_size
参数调小;
对于第一种方案,可以一股脑的将机子上的所有 CUDA 全部选上:
1 | py复制代码device = torch.device("cuda" if torch.cuda.is_available() else "cpu") |
对于第二种方案,将 batch_size
参数调小,也是有讲究的,我们要尽可能的提高资源的利用率,因此需要做一些操作:
- 首先是查看模型占用了多少 GPU,
watch -n 1 nvidia-smi
: - 然后折半减少
batch_size
,查看显存占用率,调节至合适大小:
Socket exception
由于模型跑在空闲的机子上,而样本却在另一台机子上,因此,需要通过 SFTP 进行读取,不出意外的话,要出意外了;
首先是在 pad
函数里构建 SFTP 连接:
1 | py复制代码class PadSequence(object): |
然后在 DataLoader
中使用到它的回显函数:
1 | py复制代码train_loader = DataLoader(train_data, batch_size=4, shuffle=True, num_workers = 20, collate_fn=PadSequence(maxlen = 0)) |
好的,做完上面的之后,坑爹的来了,报错了:Socket exception: Connection reset by peer (104)
不知道是因为 DataLoader
底层逻辑问题,还是这台服务器的问题,症结就是在于不能使用多进程进行 SFTP 读取,因此这里的解决方案就是将参数 num_workers
置为 0;
后记
以上就是 浅析恶意文件静态检测及部分问题解决思路 的全部内容了,大致讲述了恶意文件静态检测的其中一种思路,以及图文结合的分析了部分问题的解决思路,希望大家有所收获!
📝 上篇精讲:【AI】浅谈梯度下降算法(实战篇)
💖 我是 𝓼𝓲𝓭𝓲𝓸𝓽,期待你的关注;
👍 创作不易,请多多支持;
本文转载自: 掘金