Autoos
论文链接 : https://openreview.net/pdf?id=Rp8R9C0Sth
论文github repo : https://github.com/xuewuyinhe/AutoOS
我与chatgpt关于这篇论文的对话(自用) : https://chatgpt.com/c/673eb8ac-e494-8007-adea-e4922d997ee2
linux kernel 的配置选项过于复杂,如果不是os专家,很难进行配置
直接使用最先进的llm生成特定需求的内核配置选项,效果并不理想。
不同linux内核版本配置略有不同,llm很难灵活适配
llm上下文限制的token数量也小于内核配置文件,不能直接读取默认内核配置文件进行优化
1. 基本概念
使用 make menuconfig
配置内核选项
将配置空间抽象为一个动态树
因为选项的配置是有多级依赖关系的,所以在选择一个选项后不可选的选项类似于分支的移出,可选的选项类似于分支的插入
2. 动态树优化
限制M交K为空集,个人猜测是为了不让操作系统启动干扰配置的性能,同时也避免对关键启动配置的干扰
3.总览
-
观察阶段(Observing stage)
在此阶段,采用原子操作为LLM提供有关当前树层级的所有目录 D 和配置选项 S 的全面数据,包括选项的名称和类型等详细信息。这种方法使LLM能够适应特定配置空间的特性。 -
剪枝阶段(Pruning stage)
指导LLM评估树的每一层目录,执行中间节点的剪枝。当进行剪枝时,LLM可基于其内部知识确定剪枝概率,并执行采样过程,使剪枝既随机又由知识引导。此方法旨在预先排除与性能优化无关的子树。此外,这种剪枝过程使AutoOS能够绕过可能导致启动失败的选项,大幅降低最终纠正阶段的成本。 -
建议阶段(Proposing stage)
在此阶段,为LLM提供从观察和剪枝阶段收集的选项的语义详细信息以及内核源码中获取的全面信息。对于每个配置选项 ,利用LLM的内部知识计算其被包含在集合 M 中的概率 , 并为这些选项推荐设置值,这些建议可能会提升操作系统性能。 -
执行阶段(Acting stage)
在建议阶段之后,将建议的选项加入执行队列,按建议阶段的方法应用配置修改。如果动态树的配置空间发生变更,则从执行队列中排除已消失的选项,并将修改的选项标记为红色。随后,返回建议阶段以识别任何新出现的选项。这一阶段与建议阶段结合,形成一个循环过程,以管理新选项的持续出现,直到动态树稳定。在完成动态树遍历且没有未展开节点后,进入最终纠正阶段;否则,前往下一个子节点,返回初始的观察阶段
-
纠正阶段
在完成动态树的遍历后,我们获得了配置集 M。此时,状态机从执行阶段过渡到纠正阶段。我们采用了一个闭环过程,将错误反馈和 M 的组成部分传递给 LLM,以检测并纠正启动失败问题。
在某些情况下,LLM 辅助的纠正阶段可能无法检测到错误。在这种情况下,AutoOS 采用二分搜索方法来识别故障选项,从而确保操作系统成功启动
4. 流程
- 初始化
定义优化目标
target_list = [...]
target_object_list = [...]
初始化数据结构
caidan_pool = []
option_set = [dict([]) for _ in range(6)]
new = [dict([]) for _ in range(5)]
- 递归处理目录与选项
遍历目录结构
sta, words = menu_config.run("pwd")
words_line = words.split('\n')
for line_t in words_line:
matches = re.findall(pattern, line_t)
if len(matches) == 0:
continue
match = matches[0]
分类处理(菜单项,单选,多选,二元三元选项)
if match[1] == '':
caidan[match[2]] = match[0]
elif match[1] == '-*-':
menu_config.run(f"{match[0]}")
...
elif match[1] == '[ ]':
xuanxiang[match[2]] = '[off]'
elif match[1] == '[*]':
xuanxiang[match[2]] = '[on]'
...
用llm生成目录和选项推荐结果
ans1 = talk.ask(words_caidan, 6) # 获取目录推荐
ans2 = talk.ask(xuanxiang_prompt, iter_number) # 获取选项推荐
- 更新和保存
更新新增选项
for option in option_state[0]:
mat_t = re.findall(pattern7, option)[0]
if mat_t[0] == '[ ]':
new[0][mat_t[1]] = '[off]'
elif mat_t[0] == '[*]':
new[0][mat_t[1]] = '[on]'
...
定期保存结果
if wb % save_cycle == 0 or br == True or wb == we:
with open("output.txt", "w") as file:
for key, value in result.items():
file.write(f"{key}: {value}\n")
- 退出
达到最大递归深度,或caidan_pool(尚未处理的路径)为空,退出。
if wb == we:
print("up to iteration limit")
break
if br == True:
print("finish iteration")
break
4. 复现过程记录
之前编译运行Linux kernel 都是在wsl + busybox 下完成的,但busybox 如果使用静态编译无法识别域名(下载不了unixbench),如果使用动态编译则无法启动
最后用了vmware(以后应该会考虑换实机)
编译安装kernel 主要参考的是这两篇博客
https://blog.csdn.net/Tdh5258/article/details/108501265
https://blog.csdn.net/weixin_42581825/article/details/130001118
编译过程中出现报错: No rule to make target 'debian/certs/debian-uefi-certs.pem
只需要执行下面两行代码
scripts/config --set-str SYSTEM_TRUSTED_KEYS
scripts/config --set-str SYSTEM_REVOCATION_KEYS
5. 测试结果
将unixbech 的结果 喂给chatgpt,帮助我们整理出表格
原结果:
autoos结果: