BUAA-OS 实验笔记之 Lab1

一、总前言 操作系统是一门重课,我并不知晓自己是否做好了准备。“在这样的情况下就开始写文章,是否太着急了?” 我这样想,不知道对这门课自己是否有写文章的水平,也不知道自己是否会半途而废。 但我还是决定开始,并不是因为有什么十足的信心,而是希望这一系列文章能帮助自己更深入的理解操作系统的知识,在讲解的过程中发现自己的不足。我希望这系列能持续下去,希望未来的自己看到结果时能够满意;希望他人也能从中得到收获。 二、进入操作系统 (1)操作系统的启动 操作系统的 boot 过程是一个复杂繁琐的过程,从 bios 从上电后的启动地址开始执行,初始化硬件,读取磁盘的主引导记录,跳转到 bootloader;到加载内核程序,跳转到操作系统入口。这一整个过程难以详述…… 不过幸好在本实验中,这些都不是问题,因为我们所使用的 GXemul 模拟器不会去执行上述环节,它可以直接加载 ELF 格式内核。也就是说,我们的操作系统实验是从跳转到操作系统入口开始的。 (2)内核的入口和内存布局 所以,哪里是操作系统入口?内核入口的设置在 kernel.lds 中,这是一个链接器脚本,用于帮助链接器确定最终生成的文件的组织形式。 我们看一下该文件的开头。 /* * Set the architecture to mips. */ OUTPUT_ARCH(mips) /* * Set the ENTRY point of the program to _start. */ ENTRY(_start) 其中 OUTPUT_ARCH(mips) 设置了最终生成的文件采用的架构,对于 MOS 来说就是 mips。而 ENTRY(_start) 便设置了程序的入口函数。因此 MOS 内核的入口即 _start。这是一个符号,对应的是 init/start.S 中的 .text EXPORT(_start) .set at .set reorder /* disable interrupts */ mtc0 zero, CP0_STATUS /* omit....

三月 14, 2023 · 6 分钟 · 1206 字 · Wokron

使用 Transformer 进行机器翻译

一、transformer 简介 transformer 是 Google 在 2017 年发表的文章 Attention Is All You Need 中提出的网络架构。transformer 中只使用了注意力,实现了序列数据的处理,而未使用之前常用的 RNN 或 CNN。 对 nlp 问题,我们希望的是尽可能的获取句子的整体含义。使用 RNN,我们必须逐词获取语义,因此容易导致开头词汇词义的遗忘;使用 CNN,我们必须通过增加层数来扩大获取信息的范围。这两种方法都有很大的局限。 注意力方法则可以直接获得全局信息。方法是对一条序列,求其对于本身的注意力,这被称为自注意力。 transformer 的原理和模型较为复杂,在这里只是简单说明。 二、数据集 此为训练模型所用的数据集。设定英文为源语言,中文为要翻译成的语言。 (1)Dataset 类编写 我们根据路径打开文件,获取中英文序列和单词表。并将序列直接转化为 tensor,方便读取。 class TranslateDataset(Dataset): def __init__(self, en_path, zh_path): en_seqs, self.en_vocab = get_seq_and_vocab(en_path, get_tokenizer("basic_english")) zh_seqs, self.zh_vocab = get_seq_and_vocab(zh_path, zh_simple_tokenizer) self.items = [] for i in range(len(en_seqs)): en_seq = en_seqs[i] zh_seq = zh_seqs[i] src = en_seq tgt = zh_seq[:-1] pdt = zh_seq[1:] self....

三月 12, 2023 · 4 分钟 · 667 字 · Wokron

ESIM 网络的搭建和训练

一、前言 最近半年多的时间里学了许多人工智能,尤其是深度学习的知识,但是一直没有搭建过一个较为复杂的神经网络,最多也只是一个简单的 rnn。这主要是因为自己的笔记本没有训练较大模型的能力。 因为对nlp比较感兴趣,因此最近开始尝试跟着复旦大学邱锡鹏老师的NLP入门练习搭建网络。但到任务三时自己的笔记本就无法继续训练了,于是这次我下定决心找到训练一个比较好的训练模型的方法。最终找到了 Colab。 因为使用了Colab,本次模型的构建和训练比较成功,因而做此记录。 二、任务 本次任务是输入两个句子,判断它们之间的关系。具体来说,我们需要实现论文中提出的 ESIM 网络,并通过 SNLI数据集 进行训练,以学习预测两个句子间的关系。 三、数据集 SNLI数据集包含57万行英文句子对,并被标注了句子间的关系,包括蕴含(Entailment),矛盾(Contradiction),中立/不冲突(Neutral),未知(-)。 例如 输入文本: A man inspects the uniform of a figure in some East Asian country. 输入假设: The man is sleeping. 输出: 矛盾(C) 输入文本: A smiling costumed woman is holding an umbrella. 输入假设:A happy woman in a fairy costume holds an umbrella. 输出: 中立(N) 输入文本: A soccer game with multiple males playing. 输入假设: Some men are playing a sport....

三月 5, 2023 · 4 分钟 · 755 字 · Wokron

利用 Colab 训练神经网络

一、算力从哪里来? 曾听到过这样一种说法,深度学习 “自学 + 没经费 = 天坑”。不幸的是我似乎正处于这种状态中。自学的方面还比较好克服,可没有 gpu 进行训练就 “难为无米之炊” 了。就算理论学得再好,自己构建的模型电脑带不动,没有实践的机会,也是难以学好这门学科的。 最近我正开始学着实现更大的模型,我的笔记本此前的小模型还可以勉强撑住,可现在却完全带不动了。一方面,训练的时间太长,挤占了我使用笔记本做其他事的时间;另一方面,我的 gpu 显存太小,不能调大参数,可参数较小时又无法收敛。这就是我面临的双重两难问题。 我希望找到一处租用算力的平台。它应该同时满足如下的条件 算力丰富,能快速训练模型 对用户友好,和本机环境差别不大,能够迅速上手训练模型 费用便宜,最好有免费的算力 综合以上各点,通过搜索,我找到了 Colab。Colab(oratory) 是一个 Google 研究项目,旨在帮助传播机器学习培训和研究成果。它是一个 Jupyter 笔记本环境,不需要进行任何设置就可以使用,并且完全在云端运行。Colab 笔记本存储在 Google 云端硬盘中,并且可以共享。利用Colaboratory ,可以方便的使用Keras, TensorFlow, PyTorch, OpenCV 等框架进行深度学习应用的开发。最重要的是,Colab 可免费使用。 二、Colab基本操作 (1)创建笔记本 在正式介绍 Colab 之前需要说明一点,使用 Colab 需要科学上网。 要新建 Colab 需要创建笔记,笔记是 Colab 编辑文本、代码和运行程序的地方。使用过 jupyter notebook 的人应该很了解。不同笔记之间内容互不相通,可以把每一个笔记看做一台独立运行的虚拟机。 Colab 是谷歌的产品,因此需要实现注册好一个谷歌账号。 通过 Google Drive 创建笔记本 Google Drive 是 Google 的一款云端硬盘,操作与其他云盘,如百度网盘、阿里云盘,类似。 通过 Google Drive 可以创建 Colab 笔记。方式是:点击左上角的“新建”按钮或右击背景 => 在弹出的窗口中选择“更多” => 选择 “Google Colaboratory” 选项。...

三月 4, 2023 · 2 分钟 · 267 字 · Wokron

利用 ASM 库实现 Java 反射

一、ASM库简介 ASM 库是一款基于 Java 字节码层面的代码分析和修改工具。它能分析二进制的 class 文件并对其进行动态修改。ASM 库侧重性能,设计和实现尽可能小和快。 通过 ASM 库,我们可以方便地获取类信息,并实现类似于反射的功能。ASM 库处理字节码,因此能得到仅仅使用反射无法获取的信息,如方法内的结构。 ASM 库同样具有动态修改和创建类文件的功能,但本篇文章主要使用 ASM 库的字节码读取功能。 本篇文章假设读者能自行通过Maven或其他方式添加ASM库依赖。 二、利用ASM库访问类文件 ASM 库的核心库提供了读取和修改字节码的基本 API。核心库包含如下几个工具类: ClassReader ClassReader 类用于从 class 文件中加载字节码。这样,这一 ClassReader 对象就拥有了关于某一类的所有信息。 ClassVisitor ClassVisitor 类可以从 ClassReader 中获取想要的信息。 ClassVisitor 是访问者模式的访问类。简单解释访问者模式,就是被访问的对象调用访问者类的方法,从而使得访问者获取希望得到的数据。 还是通过 ASM 的例子来理解吧,ClassVisitor 实际是一个抽象类,其中定义了一个方法 visit。该方法的签名为: visit(int version, int access, String name, String signature, String superName, String[] interfaces) 假设我们继承 ClassVisitor 创建了一个新的访问类,那么获取信息的方式如下: ClassReader cr = new ClassReader("className"); ClassVisitor cv = new ClassVisitor(Opcodes.ASM5) { // this is an anonymous class }; cr....

二月 21, 2023 · 3 分钟 · 442 字 · Wokron

Java 注解与 C# 特性

一、元数据简介 元数据是指用来描述数据的数据。对编程语言来说,元数据可以为程序中元素添加额外的信息。这一功能可以被用于描述代码间关系,以及代码与其他资源的联系。 元数据可以被用于框架中。通过元数据可以实现在代码上对类的直接配置,避免编写如 xml 的配置文件。 Java 和 C# 都具有为程序中元素,如类、方法等等,添加元数据的方式。Java中称为注解,而C#中称为特性。注解和特性都通过反射获取,关于两者的获取方式,已经在前一篇文章中有所记述。本篇只讨论注解和特性的定义和使用。 二、Java注解 注解的定义 如果想要自定义注解,需要继承 Annotation 类。 public class MyAnnotation extends Annotation { } 同时还有另一种写法,由此可知注释本质上是接口 public @interface MyAnnotation2 { } 和接口一样,注解可以添加静态变量 我们可以为注解添加“参数”,比如 Spring 中的注解 @Profile(value = "dev")。我们为其设置了 value 属性。 但是注解本是接口,不可能有保存数据的能力,要如何设置注解的属性呢?实际上,注解的属性在编写 Annotation 时是一个方法。即 public @interface MyProfile { String value(); } 还可以为参数添加默认值 public @interface MyAnnotation3 { String value(); int number() default 8; // set default number } 注解经常和枚举一起使用。 public @interface MyAnnotation4 { enum SELECT_TYPE {TYPE_A, TYPE_B} SELECT_TYPE selectType() default TYPE_A; } 元注解 元注解是注解的元数据,也就是对注解的注解。元注解为注解设置额外的信息,如设置注解的作用对象等等。...

二月 20, 2023 · 1 分钟 · 196 字 · Wokron