随笔分类 - 机器学习系统设计
摘要:消费者 回忆:生产者提供产品的接口 在第捌章,IO系统(二)中,生产者DataReader提供了外部消费接口: class DataReader { public: ......... BlockingQueue<Datum*>& free() const { return ptr_pair->fr
阅读全文
摘要:数据变形 IO(二)中,我们已经将原始数据缓冲至Datum,Datum又存入了生产者缓冲区,不过,这离消费,还早得很呢。 在消费(使用)之前,最重要的一步,就是数据变形。 ImageNet ImageNet提供的数据相当Raw,不仅图像尺寸不一,ROI焦点内容比例也不一,如图: [Krizhevsk
阅读全文
摘要:听说Google出了TensorFlow,那么Caffe应该叫什么? ——BlobFlow 神经网络时代的传播数据结构 我的代码 我最早手写神经网络的时候,Flow结构是这样的: struct Data { vector<double> feature; int y; Data(vector<dou
阅读全文
摘要:生产者 双缓冲组与信号量机制 在第陆章中提到了,如何模拟,以及取代根本不存的Q.full()函数。 其本质是:除了为生产者提供一个成品缓冲队列,还提供一个零件缓冲队列。 当我们从外部给定了固定容量的零件之后,生产者的产能就受到了限制。 由两个阻塞队列组成的QueuePair,并不是Caffe的独创,
阅读全文
摘要:你说你会关系数据库?你说你会Hadoop? 忘掉它们吧,我们既不需要网络支持,也不需要复杂关系模式,只要读写够快就行。 ——论数据存储的本质 关系数据库横行已久,似乎大家已经忘了早些年那些简陋的数据存储模式。 在ACM选手中,流传着“手艹数据库”的说法,即利用map<string,type>或者ma
阅读全文
摘要:你说你学过操作系统这门课?写个无Bug的生产者和消费者模型试试! ——你真的学好了操作系统这门课嘛? 在第壹章,展示过这样图: 其中,左半部分构成了新版Caffe最恼人、最庞大的IO系统。 也是历来最不重视的一部分。 第伍章又对左半部分的独立性进行了分析,我是这么描述到: Datum和Blob(Ba
阅读全文
摘要:你为Class外访问private对象而苦恼嘛?你为设计序列化格式而头疼嘛? ——欢迎体验Google Protocol Buffer 面向对象之封装性 历史遗留问题 面向对象中最矛盾的一个特性,就是“封装性”。 在上古时期,大牛们无聊地设计了三种访问域: public、private、protec
阅读全文
摘要:不精通多线程优化的程序员,不是好程序员,连码农都不是。 ——并行计算时代掌握多线程的重要性 线程与操作系统 用户线程与内核线程 广义上线程分为用户线程和内核线程。 前者已经绝迹,它一般只存在于早期不支持多线程的系统中。 它用模拟的方式实现一个模拟的多线程系统,不支持异步。 即,一个线程被阻塞了,其它
阅读全文
摘要:你需要一个管家,随手召唤的那种,想吃啥就吃啥。 ——设计一个全局线程管理器 一个机器学习系统,需要管理一些公共的配置信息,如何存储这些配置信息,是一个难题。 在传统的MVC编程框架中,通常采取设立数据中心的做法,将所有配置信息存在其中。 同时,将数据中心指针共享至所有类,形成一个以数据为中心,多重引
阅读全文
摘要:你左手是内存,右手是显存,内存可以打死显存,显存也可以打死内存。 —— 请协调好你的主存 从硬件说起 物理之觞 大部分Caffe源码解读都喜欢跳过这部分,我不知道他们是什么心态,因为这恰恰是最重要的一部分。 内存的管理不擅,不仅会导致程序的立即崩溃,还会导致内存的泄露,当然,这只针对传统CPU程序而
阅读全文
摘要:请以“仰望星空与脚踏实地”作为题目,写一篇不少于800字的文章。除诗歌外,文体不限。 ——2010·北京卷 仰望星空 规范性 Caffe诞生于12年末,如果偏要形容一下这个框架,可以用"须敬如师长"。 这是一份相当规范的代码,这个规范,不应该是BAT规范,那得是Google规范。 很多自称码农的人应
阅读全文
摘要:工作环境 巧妇有了米炊 众所周知,Caffe是在Linux下写的,所以长久以来,大家都认为跑Caffe,先装Linux。 niuzhiheng大神发起了caffe-windows项目(解决了一些编译、API相异问题) 以及willyd大神发起的caffe-windows-dependencies项目
阅读全文