博文

终于在Fedora 27上把nvidia-docker2装上了

在开始一切工作之前,先把和nvidia以及cuda相关的rpm全删掉。

第一步是装显卡驱动。
不要通过rpmfusion来安装cuda和nvidia的driver,否则会遇到各种version mismatch。我需要最新的kernel,最新的gpu driver,但是我不需要最新的CUDA!!

kernel启动的命令行参数一定要注意加上rd.driver.blacklist=nouveau。我是通过EFI启动的,如果不加这个,会在kernel boot的时候初始化fb,加载nouveau,然后nvidia的闭源驱动就无法初始化了。nouveau就是个占着茅坑不拉屎的废物,任何时候都不要用它!!


然后,怎么装cuda。
nvidia-docker2依赖于cuda,但是cuda在fedora 27上实际上是个半残废。
Fedora 26和Fedora 27的gcc是 7.x,太新了。没法和cuda9一起用。cuda9要求gcc的version<=6.x 。所以需要Fedora的version <=25。
cuda提供了Fedora 25的rpm repo,如果直接安装这个,会依赖于很多Fedora 25的package,会引来冲突。
我是用cuda的run file来安装cuda 9.0, 在fedora 27上。
安装的时候会询问是否装drivers。此时要选择不装。因为那个driver版本太老,在新的kernel上编译不过。


最后是docker。
$ dnf install docker-ce
不要安装nvidia-docker2这个包,否则会把docker这个rpm带进来。安装nvidia-container-runtime即可。

dnf install nvidia-container-runtime

$ cat /etc/docker/daemon.json
{
    "runtimes": {
        "nvidia": {
            "path": "/usr/bin/nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}

n…

这几天玩快手玩的入迷

国庆这几天我在家啥事没干,除了看电视就是玩“快手”。快手是一个短视频App,非常火爆,对我来说就像是一个迷一般的存在。

快手视频圈破了一个谎言:“中美有巨大的文化差异,中国人不爱拍视频上网炫耀,所以YouTube这样类型的网站在中国没有用户基础”。10多年前,优酷、土豆、酷6、六间房等一群中国的视频网站都号称自己是中国的YouTube,但是实际上干的是以“用户上传”为名的盗版影视剧。接着他们又撕破自己谎言,为自己正名,说YouTube那套在中国行不通。二三个学生对着摄像头抱着吉他弹啊弹,也不咋好听,就有几百万的播放量,这在中国不可能。对于这种文化差异,分析的头头是道,在2012年前后,这基本是同行的共识。反正我是信了。但是自从近些年有了快手,这谎言真是不攻自破了。快手才是中国的YouTube。无数优秀的企业家怀揣着这样的梦想但是都没有成功,只有快手把这条路走通了,印证了这是可行的。

快手吸引我之处在于它浓浓的村土气息。比如,一堆堆的玉米棒子,晒怎么割蜂蜜吃蜂蜜的,一个小姑娘坐那开拖拉机,小县城的婚礼,商场为了招揽顾客而做的各种奇葩演出…… 这些是我平时想看却又看不到的。我很想去山里找个农家院住半个月,去秦岭山里走走,夏天去地里帮农民割麦子。我很怀念小时候我们把收来的谷子放在一个大木缸里面使劲摔,把谷粒打出来。我居然能在快手上找到这样的视频!还有,一些厂妹在晒她们在工厂里的生活。那一排排的机器,也是我从来没见过的。

同时,快手又是一家很低调的技术公司。该公司招人的bar很高,能人不少。可以明显看出它的视频个性化推荐做的很不错,绝对是国内领先地位。但是却鲜有见他们在各种技术大会上招摇。

不过快手的直播真是太差劲了。我看见的全是美女秀场。一口浓浓的东北腔,不停的在说“谢谢xxx送的****"。没什么才艺,没什么内容,就是干巴巴的在不停招呼客人。实在是没兴趣。

另一方面,快手的内容还是太偏PGC。能进入我的feed流的,基本都是有几十万或上百万粉丝的专业号。内容太集中,太单调。


ACK, SACK, D-SACK

In an ACK, the Acknowledgment Number field indicates the number for the next byte in the contiguous byte stream that the ACK’s sender expects to receive。

SACK(RFC 2018): SACK包含多个块,每个块里是已收到的。

通常来说  ACK < SLE1 < SRE1 < SLE2 < SRE2 ...

ACK是我下一个想要的,[SLE1, SRE1],[SLE2, SRE2]是我已经收到的。


D-SACK(rfc2883): 这种是SLE1<ACK的情形

例如:
Transmitted    Received    ACK Sent
Segment        Segment     (Including SACK Blocks)

3000-3499      3000-3499   3500 (ACK dropped)
3500-3999      3500-3999   4000 (ACK dropped)
3000-3499      3000-3499   4000, SACK=3000-3500

OS:Windows Server 2008 and Windows Vista, Linux 2.4+

Fast retransmit: 连续收到多个重复的ACK。

TODO: RFC 3517

想换个新路由器

我现在的路由器是netgear r6300v2,真的是太赞了。网上口碑甚好。这是我用的第一款基于ARM的路由器。但是我还是想换一个更好一点的。

于是在思索两种方案,一个是继续走ARM的路买一个r6300的升级版,另一个是选一个mini-itx无风扇的系统装Linux做软路由。

能提供WIFI解决方案的硬件厂商并不多。进入到802.11ac时代以后,大玩家就只剩下高通、Broadcom、Intel、Marvell、联发科、Quantenna、RealTek。

高通家的:
先说WiSoC。AC时代主要是IPQ4018/IPQ4019/IPQ402。Cortex A7,主频717 MHz,比如Google Wifi,netgear Orbi就采用了这系列。
AD时代主要是IPQ8072/IPQ8074,目前基本上还没有对应产品上市。
然后说纯CPU。主要是IPQ8062/IPQ8064/IPQ8065等等,这些只是处理器,用的是Krait处理器,全是ARMv7双核,主频1.0G-1.7G左右,和A15相仿。 代表作Netgear R7800和Google OnHub。

Broadcom:
Broadcom的WiSoC卖的不好,主要还是处理器和wifi芯片组分开卖。
处理器典型如Broadcom Northstar系列:
A9系列:BCM4707/BCM4708/BCM4709/...,比如著名的6300v2用的就是BCM4708A0,主频0.8 G,小米路由1用的是BCM4708A0,主频1G。这些基本都是基于Cortex A9。Northstar系列A53系列:如ASUS RT-AC86U、Netgear R8000P

联发科:
联发科的MT7620A/MT7620N WiSoC 可谓爆款中的爆款。比如小米路由3就是采用的它。缺点也蛮多,这款产品是MIPS的,不是ARM。而且不支持usb 3.0。

RealTek:
我发现他家的RTL8812BU是当前市面上唯一一个支持MU-MIMO的USB3.0 模块。意思是说,想买一个USB3.0的支持MU-MIMO的网卡,那么只能是他们家的。

再说x86这边。大部分低功耗的主板都只有一个网口,所以不适合做路由。高功耗的主板需要风扇,对我来说太吵了。我找来找去,非山寨的,就只有超微在做这样的产品。目前看中了E200-9B。E100…

web证书现在需要 Subject Alternative Name了

我刚发现我之前自己给自己签发的web server的证书在chrome下都失效。 chrome提示说:
 security certificate is from [missing_subjectAltName]. This may be caused by a misconfiguration or an attacker intercepting your connection.

据说这是chrome 58开始的新特性。我在找怎么修改openssl的命令以添加这个新属性进去。找了一半天没找到,网上的文档似乎都是得写一个配置文件才行,而我又比较懒。

我现在用的命令是:

openssl genrsa -out server.key 2048

openssl req -new -key server.key -out server.csr

openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt -extensions v3_req

如果你知道新的正确的,请告诉我




2017-07-03

上个月给手机升级了Android O,太慢太卡了,于是今天又刷回Android 7.1。顺便root了一下。我是通过自己编译adbd然后放入boot.img来root,但是很奇怪,似乎我用cpio手动打包的initrd.img 总是有问题,不能boot。只能通过在asop的源代码中make bootimg来生成boot.img才行。嗯……一定是我漏了什么。


tensorflow resource notes

在单机版中,创建session的时候会创建devices,创建device的时候会为每个device创建一个ResourceMgr。每个ResourceMgr可以有多个container。所以,在单机版中,session被销毁后它所对应的ResourceMgr里的那些resource也会被销毁。但是分布式版中就不是如此了。

ResourceMgr有这样一个成员:

std::unordered_map<string, Container*> containers_;

container name一般是job name。每个Container里面会放很多从ResourceBase继承来的resource。

  typedef std::pair<uint64, string> ResourceKey;
  typedef std::unordered_map<ResourceKey, ResourceBase*> Container;

单机版无GPU的情况下,默认的device name是"/job:localhost/replica:0/task:0/cpu:0"。其中,job name就是localhost。

单机版的TF会运行每个step的时候,在DirectSession::RunState的构造函数中创建一个per-step的container(ScopedStepContainer),用来存放per-step resources。

ResourceKey里的那个string是resource name,一般是node name。而那个uint64是那个ResourceBase的子类的type的hash_code(type_index.hash_code())。所以不同类型的Resource可以重名。所以,对于某个特定的session来说,它是通过(device name, resource type, container name, resource name) 这样的四元组来定位到一个resource。

DT_RESOURCE是一种新的tensor类型,大约是在去年10月份的时候,0.12版加入的。它所对应的数据类型是ResourceHandle protobuf。该对象的创建以及访问被封装在Res…