-
Notifications
You must be signed in to change notification settings - Fork 0
/
paper-tensorflow-with-rdma.html
1448 lines (594 loc) · 54.1 KB
/
paper-tensorflow-with-rdma.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html class="theme-next pisces use-motion" lang="en">
<head>
<meta charset="UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=2"/>
<meta name="theme-color" content="#222"/>
<link rel="stylesheet" href="/lib/font-awesome/css/font-awesome.min.css?v=4.6.2"/>
<link rel="stylesheet" href="/css/main.css?v=7.0.1"/>
<link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon-next.png?v=7.0.1">
<link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32-next.png?v=7.0.1">
<link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-16x16-next.png?v=7.0.1">
<link rel="mask-icon" href="/images/logo.svg?v=7.0.1" color="#222">
<script id="hexo.configurations">
var NexT = window.NexT || {};
var CONFIG = {
root: '/',
scheme: 'Pisces',
version: '7.0.1',
sidebar: {"position":"left","display":"post","offset":12,"onmobile":false,"dimmer":false},
back2top: true,
back2top_sidebar: false,
fancybox: false,
fastclick: false,
lazyload: false,
tabs: true,
motion: {"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"slideDownIn","post_body":"slideDownIn","coll_header":"slideLeftIn","sidebar":"slideUpIn"}},
algolia: {
applicationID: '',
apiKey: '',
indexName: '',
hits: {"per_page":10},
labels: {"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}
}
};
</script>
<meta name="description" content="本文屬於論文導讀系列,這次針對的是高速網路(RDMA)的應用,來源是 SICCOM 2017 會議上。這篇文章有趣的地方在於他不是單純的介紹架構,而是透過一個實際的應用程式來闡述當該應用程式搭配上 RDMA 後獲得了 Zero Copy 的特色,在此特色加持下,原先應用程式的效能提升了多少。本文的標題是 Towards Zero Copy Dataflows using RDMA, 其內容跟 AI">
<meta name="keywords" content="RDMA,Tensorflow, Paper, SICCOM">
<meta property="og:type" content="article">
<meta property="og:title" content="[論文導讀] - Towards Zero Copy Dataflows using RDMA">
<meta property="og:url" content="https://www.hwchiu.com/paper-tensorflow-with-rdma.html">
<meta property="og:site_name" content="Hwchiu Learning Note">
<meta property="og:description" content="本文屬於論文導讀系列,這次針對的是高速網路(RDMA)的應用,來源是 SICCOM 2017 會議上。這篇文章有趣的地方在於他不是單純的介紹架構,而是透過一個實際的應用程式來闡述當該應用程式搭配上 RDMA 後獲得了 Zero Copy 的特色,在此特色加持下,原先應用程式的效能提升了多少。本文的標題是 Towards Zero Copy Dataflows using RDMA, 其內容跟 AI">
<meta property="og:locale" content="en">
<meta property="og:image" content="https://i.imgur.com/IYecwlJ.png">
<meta property="og:updated_time" content="2018-10-20T07:40:37.988Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="[論文導讀] - Towards Zero Copy Dataflows using RDMA">
<meta name="twitter:description" content="本文屬於論文導讀系列,這次針對的是高速網路(RDMA)的應用,來源是 SICCOM 2017 會議上。這篇文章有趣的地方在於他不是單純的介紹架構,而是透過一個實際的應用程式來闡述當該應用程式搭配上 RDMA 後獲得了 Zero Copy 的特色,在此特色加持下,原先應用程式的效能提升了多少。本文的標題是 Towards Zero Copy Dataflows using RDMA, 其內容跟 AI">
<meta name="twitter:image" content="https://i.imgur.com/IYecwlJ.png">
<link rel="alternate" href="/atom.xml" title="Hwchiu Learning Note" type="application/atom+xml"/>
<link rel="canonical" href="https://www.hwchiu.com/paper-tensorflow-with-rdma.html"/>
<script id="page.configurations">
CONFIG.page = {
sidebar: "",
};
</script>
<title>[論文導讀] - Towards Zero Copy Dataflows using RDMA | Hwchiu Learning Note</title>
<script>
window.fbAsyncInit = function() {
FB.init({
appId : '',
xfbml : true,
version: 'v2.10'
});
};
(function(d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) {return;}
js = d.createElement(s); js.id = id;
js.src = "//connect.facebook.net/en/sdk.js";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));
</script>
<script async src="//www.googletagmanager.com/gtag/js?id=UA-54006186-1"></script>
<script>
var host = window.location.hostname;
if (host !== "localhost" || !true) {
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'UA-54006186-1');
}
</script>
<noscript>
<style>
.use-motion .motion-element,
.use-motion .brand,
.use-motion .menu-item,
.sidebar-inner,
.use-motion .post-block,
.use-motion .pagination,
.use-motion .comments,
.use-motion .post-header,
.use-motion .post-body,
.use-motion .collection-title { opacity: initial; }
.use-motion .logo,
.use-motion .site-title,
.use-motion .site-subtitle {
opacity: initial;
top: initial;
}
.use-motion .logo-line-before i { left: initial; }
.use-motion .logo-line-after i { right: initial; }
</style>
</noscript>
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<script>
(adsbygoogle = window.adsbygoogle || []).push({
google_ad_client: "ca-pub-1100711228720990",
enable_page_level_ads: true
});
</script>
</head>
<body itemscope itemtype="http://schema.org/WebPage" lang="en">
<div class="container sidebar-position-left page-post-detail">
<div class="headband"></div>
<header id="header" class="header" itemscope itemtype="http://schema.org/WPHeader">
<div class="header-inner"><div class="site-brand-wrapper">
<div class="site-meta">
<div class="custom-logo-site-title">
<a href="/" class="brand" rel="start">
<span class="logo-line-before"><i></i></span>
<span class="site-title">Hwchiu Learning Note</span>
<span class="logo-line-after"><i></i></span>
</a>
</div>
<h1 class="site-subtitle" itemprop="description">kubernetes, sdn, linux,devops</h1>
</div>
<div class="site-nav-toggle">
<button aria-label="Toggle navigation bar">
<span class="btn-bar"></span>
<span class="btn-bar"></span>
<span class="btn-bar"></span>
</button>
</div>
</div>
<nav class="site-nav">
<ul id="menu" class="menu">
<li class="menu-item menu-item-home">
<a href="/" rel="section"><i class="menu-item-icon fa fa-fw fa-home"></i> <br/>Home</a>
</li>
<li class="menu-item menu-item-about">
<a href="/about/" rel="section"><i class="menu-item-icon fa fa-fw fa-user"></i> <br/>About</a>
</li>
<li class="menu-item menu-item-tags">
<a href="/tags/" rel="section"><i class="menu-item-icon fa fa-fw fa-tags"></i> <br/>Tags</a>
</li>
<li class="menu-item menu-item-archives">
<a href="/archives/" rel="section"><i class="menu-item-icon fa fa-fw fa-archive"></i> <br/>Archives</a>
</li>
<li class="menu-item menu-item-sitemap">
<a href="/sitemap.xml" rel="section"><i class="menu-item-icon fa fa-fw fa-sitemap"></i> <br/>Sitemap</a>
</li>
</ul>
</nav>
</div>
</header>
<a href="https://github.com/hwchiu" class="github-corner" title="Follow me on GitHub" aria-label="Follow me on GitHub" rel="noopener" target="_blank"><svg width="80" height="80" viewBox="0 0 250 250" style="fill: #222; color: #fff; position: absolute; top: 0; border: 0; right: 0;" aria-hidden="true"><path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path><path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor" style="transform-origin: 130px 106px;" class="octo-arm"></path><path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" fill="currentColor" class="octo-body"></path></svg></a>
<main id="main" class="main">
<div class="main-inner">
<div class="content-wrap">
<div id="content" class="content">
<div id="posts" class="posts-expand">
<article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
<div class="post-block">
<link itemprop="mainEntityOfPage" href="https://www.hwchiu.com/paper-tensorflow-with-rdma.html"/>
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="name" content="Hwchiu"/>
<meta itemprop="description" content="kubernetes/SDN/DevOps"/>
<meta itemprop="image" content="/images/avatar.jpg"/>
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="Hwchiu Learning Note"/>
</span>
<header class="post-header">
<h2 class="post-title" itemprop="name headline">[論文導讀] - Towards Zero Copy Dataflows using RDMA
</h2>
<div class="post-meta">
<span class="post-time">
<span class="post-meta-item-icon">
<i class="fa fa-calendar-o"></i>
</span>
<span class="post-meta-item-text">Posted on</span>
<time title="Created: 2018-01-23 02:27:30" itemprop="dateCreated datePublished" datetime="2018-01-23T02:27:30+00:00">2018-01-23</time>
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-calendar-check-o"></i>
</span>
<span class="post-meta-item-text">Edited on</span>
<time title="Modified: 2018-10-20 07:40:37" itemprop="dateModified" datetime="2018-10-20T07:40:37+00:00">2018-10-20</time>
</span>
<span class="post-comments-count">
<span class="post-meta-divider">|</span>
<span class="post-meta-item-icon">
<i class="fa fa-comment-o"></i>
</span>
<span class="post-meta-item-text">Comments: </span>
<a href="/paper-tensorflow-with-rdma.html#comments" itemprop="discussionUrl">
<span class="post-comments-count disqus-comment-count" data-disqus-identifier="paper-tensorflow-with-rdma.html" itemprop="commentCount"></span>
</a>
</span>
<div class="post-description">本文屬於論文導讀系列,這次針對的是高速網路(RDMA)的應用,來源是 SICCOM 2017 會議上。這篇文章有趣的地方在於他不是單純的介紹架構,而是透過一個實際的應用程式來闡述當該應用程式搭配上 RDMA 後獲得了 Zero Copy 的特色,在此特色加持下,原先應用程式的效能提升了多少。本文的標題是 Towards Zero Copy Dataflows using RDMA, 其內容跟 AI 的訓練過程有關,採用了由 Google 開源的訓練框架, Ternsorflow, 並且分析了在原先分散式的訓練模型中,資料不論在 CPU/GPU UserSpace/KernelSpace 甚至節點間都有大量的資料複製行為。透過 RDMA 的幫忙減少了這些行為最後證明了整體分散式訓練的時間大幅度縮短,是個非常有趣的短文.</div>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<h1 id="Preface"><a href="#Preface" class="headerlink" title="Preface"></a>Preface</h1><p>2017 SICCOM 上面出現了一篇令人感到有趣的論文,內容是 <strong>Towards Zero Copy Dataflows using RDMA</strong>,可以到 <a href="https://dl.acm.org/citation.cfm?id=3131975" target="_blank" rel="noopener">這邊</a> 閱讀該篇論文內容。</p>
<p>再看一篇論文前,最重要的就是其摘要,根據其摘要我們可以快速的對該篇論文有一個基本的認識,所以先來看一下該篇論文的摘要</p>
<h1 id="ABSTRACT"><a href="#ABSTRACT" class="headerlink" title="ABSTRACT"></a>ABSTRACT</h1><blockquote>
<p>Remote Direct Memory Access (RDMA) offers ultra-low latency and<br>CPU bypass networking to application programmers. Existing applications<br>are often designed around socket based software stack that<br>manages application buffers separately from networking buffers<br>and do memory copies between them when sending/receiving data.</p>
</blockquote>
<p>先大概介紹了一下 RDMA 的特性與價值,想要瞭解更多關於 RDMA 的可以參考<a href="https://www.hwchiu.com/rdma-introduction-i.html">這篇文章</a>。</p>
<blockquote>
<p>With large sized (up to hundreds MB) application buffers, the cost of<br>such copies adds non trivial overhead to the end-to-end communication<br>pipeline.</p>
</blockquote>
<p>這篇就是問題的重點,大檔案資料在複製過程中產生的負擔,也是本篇論文想要解決的問題。</p>
<blockquote>
<p>In this work, we made an attempt to design a zero copy<br>transport for distribute dataflow frameworks that unifies application<br>and networking buffer management and completely eliminates<br>unnecessary memory copies.</p>
</blockquote>
<p>這裡提到,這篇論文怎麼解決上述問題,而且直接瞭當的說明其方法就是,<strong>zero copy transport for distrubute dataflow frameworks</strong>.</p>
<blockquote>
<p>Our prototype on top of TensorFlow<br>shows 2.43x performance improvement over gRPC based transport<br>and 1.21x performance improvement over an alternative RDMA<br>transport with private buffers and memory copies.</p>
</blockquote>
<p>最後說明上述的 <strong>distrubute dataflow frameworks</strong> 採用的是 <strong>tensorflow</strong>,並且評比了一下效能 ((job 完成的時間))。<br>這邊比較的是原生的 gRPC 版本,以及 <strong>Yahoo</strong> 所開發的版本<br>其中 Yahoo 開發的版本可以在 <a href="https://github.com/yahoo/TensorFlowOnSpark" target="_blank" rel="noopener">Github</a> 這邊看到</p>
<p>該篇論文內容滿簡短的,只有短短的三頁,大抵上分成</p>
<ol>
<li>有什麼問題</li>
<li>這個問題可以怎麼解決</li>
<li>效能評估</li>
</ol>
<p>詳細的實作內容跟架構設計都用用短短的文字帶過而已,所以在看這篇論文的時候,必須要有一定的背景知識,才能夠更容易地去想像作者想要表達的意思。</p>
<h1 id="Tensorflow"><a href="#Tensorflow" class="headerlink" title="Tensorflow"></a>Tensorflow</h1><p>由於這篇文章著使用的 <strong>tensorflow</strong>,並且是基於分散式運算的 <strong>tensorflow</strong>,所以在開始本文之前,必須要先來複習一下分散式的 <strong>tensorflow</strong>架構,並且了解一下其基本的運作行為與概念。<br>這邊就不介紹,可以直接參考 <a href="https://kairen.github.io/2017/04/10/tensorflow/intro/" target="_blank" rel="noopener">TensorFlow 基本使用與分散式概念</a> 這篇文章來學習</p>
<h1 id="INTRODUCTION"><a href="#INTRODUCTION" class="headerlink" title="INTRODUCTION"></a>INTRODUCTION</h1><p>近年來,不論是小/中/大企業,或是資料中心內部的網路交換機都轉換成10G/40G,甚至是100G,愈來愈多高速網路的需求。再軟體方面,為了能夠達到這些高速網路(高流量,低延遲性),有很多相關的技術都被發展出來,譬如 Intel 的 <strong>DPDK</strong>, Mellanox 推出的 <strong>ASAP2</strong> 以及本文的主角 <strong>RDMA(Remote Directly Memory Access)</strong>。<br>然而世界上大部分運行於 <strong>Linux</strong> 上的網路應用程式,幾乎都是採用 <strong>BSD</strong> 規範的 <strong>SocketAPI</strong> 來進行網路程式開發,這意味者</p>
<ol>
<li>所有的網路封包都是依賴 <strong>Linux Kernel</strong> 的 <strong>TCP/IP</strong> 來進行處理</li>
<li>每個從應用程式送出去的封包都要再 <strong>User-Space</strong> 與 <strong>Kernel-Space</strong> 傳遞,每次的傳遞都牽扯到資料的交換。<br>然而上述提到的相關技術,本身於程式撰寫方面都會有特別的 <strong>API</strong> 要使用,因為大部分的概念都是趨近於 <strong>Kernel Bypass</strong>,整個封包的流程都會跳過 <strong>Kernel</strong>,所以沒有辦法直接使用傳統 <strong>BSD</strong> 的 <strong>API</strong>。<br>以 <strong>RDMA</strong> 來說,為了讓現有的應用程式能夠簡單的直接轉移到 <strong>RDMA</strong> 的使用,有了如 <strong>RSocket</strong> 或 <strong>SDP</strong> 這類設計來模擬傳統 <strong>BSD API</strong> 接口的 <strong>API</strong>。<br>根據本文作者的描述,這類型的 <strong>API</strong> 並沒有辦法完全的使用到 <strong>RDMA</strong> 的優勢,還是有一些額外的負擔產生使得封包延遲性提高。</li>
</ol>
<p>除了網路之外,再 <strong>AI</strong>發展方面,<strong>Dataflow</strong> 這種架構在近年的軟體中可是蓬勃發展並被使用,不論是 <strong>Spark</strong>, <strong>Naiad</strong>, <strong>Hadoop</strong> 以及 <strong>Tensorflow</strong> 這些框架內都有 <strong>Dataflow</strong> 的概念存在。<br><strong>Dataflow</strong> 本身是一個有向無迴圈的圖,如下圖<br><img src="https://i.imgur.com/IYecwlJ.png" alt=""><br>其中我們稱沒有任何輸入的點叫做 <strong>Source</strong>, 而沒有任何輸出的點稱為 <strong>Sink</strong></p>
<p>在該圖中,每一個節點都意味者一個操作/運算,而每個節點的輸出都會是下一個節點的輸入,所以再分散式的架構中,這些圖就會構建成整個資料傳輸的路徑。<br>根據作者的觀察,再一些典型的使用情境中,這些輸入/輸出的資料都是一些大型且不會變動的資料。<br>而且根據上述所言,這些資料在當前的網路應用程式設計中,都會牽扯到多次的複製。而這些多次的複製行為就會產生負擔,對於整個傳輸行為造成不小的影響。</p>
<p>所以是否能夠透過上述的技術,透過 <strong>Kernel Bypass</strong> 或是 <strong>Zero Copy</strong> 等概念來解決上述問題,並且提升整體的傳輸效率就是本文的想要解決問題的方法。</p>
<p>在本文中,作者使用了 <strong>RDMA</strong> 的方式來完成的<strong>點對點</strong>之間的 <strong>Zero Copy</strong>,其實作的重點如下</p>
<ol>
<li>基於 Tensorflow</li>
<li>設計一款新的 <strong>Memory Allocator</strong>,能夠解析當前分散式架構中的圖表資訊,並且收集緩衝區使用的相關資訊。藉由這個辦法與 <strong>RDMA</strong> 的整合,移除系統中沒必要的記憶體複製行為</li>
<li>根據效能評測 (job 完成的時間),若比較對象為原生基於 TCP/IP 與 gRPC 的 <strong>Tensorflow</strong>,其效能能夠提升 2.43 倍,所比較對象是 <strong>YAHOO</strong> 所開發的 <strong>Tensorflow</strong>,其效能也能夠提升 1.21 倍。</li>
</ol>
<h1 id="DESIGN"><a href="#DESIGN" class="headerlink" title="DESIGN"></a>DESIGN</h1><h2 id="System-amp-Library"><a href="#System-amp-Library" class="headerlink" title="System & Library"></a>System & Library</h2><p>目前現存的 <strong>dataflow</strong> 相關應用程式再底層傳輸資料時,大抵上分成兩種方式傳輸,一種是採用 <strong>RPC</strong> 的方式去設計收送的資料格式,另外一種則是基於檔案區塊(File Block)進行傳輸。<br>舉例來說, <strong>Tensorflow</strong> 以及早期版本的 <strong>Spark</strong> 就是使用 <strong>RPC</strong> 的方式進行跨節點的資料傳輸。後期版本的 <strong>Spark</strong> 以及 <strong>Hadoop (MapReduces)</strong> 則是將檔案輸出到本地的檔案系統,然後再將該檔案區塊傳輸到其他節點。<br>作者認為,<strong>RPC</strong> 於傳輸有者效能上的缺失,主要歸咎於 <strong>RPC</strong> 的請求/回復(Request/Response) 本身不但有大量的資料複製,同時也有可能有加解密(Encoding/Decoding)。<br>這些行為都會嚴重的消耗 <strong>CPU</strong>運算,並且降低點到點的傳輸速度與提高延遲性。<br>至於檔案區塊(File Block)通常都會將檔案存到外部的檔案系統,即使是 <strong>RAMFS(Memory Based File System)</strong> 也是會牽扯到很多資料複製的行為。</p>
<p>作者認為上述的問題主要在於<strong>API</strong>的設計行為,此行為導致計算(<strong>computation</strong>)與傳輸(<strong>communication</strong>)兩個子系統都自行管理自己的記憶體空間,彼此沒有共享。<br>這種情況下很難真正去實現點對點的 <strong>Zero Copy</strong> 的資料傳輸,(這邊也呼應前面的 rSOCKET的設計依然會有非必要的資料複製行為)。<br>作者認為在這種架構下,不論這兩個子系統都設計了多良好的緩衝區管理(Buffer Management),都至少會有一次的資料複製行為。<br>舉例來說,假如我們採用了最廣為流行的 <strong>TCP/IP</strong> 系統,在 <strong>Linux Kernel</strong> 內部會採用 <strong>sk_buff</strong> 的結構來儲存網路封包,而且在底層大部分針對網路封包操作的行為都是基於指標去操作,雖然這類看起來都是指標操作的行為的確避免了任何資料複製的動作。<br>但是資料要從 <strong>User Space</strong> 轉送到 <strong>Kernel Space</strong> 還是需要經過一次的轉換。<br>這類型的問題不論是在各種 <strong>RPC</strong> 或是 函式庫(<strong>Library</strong>)內都有出現。</p>
<h2 id="Dataflow"><a href="#Dataflow" class="headerlink" title="Dataflow"></a>Dataflow</h2><p>對於 <strong>Dataflow</strong> 來說,作者認為若在高速網路環境中同時滿足下列兩種情形,則記憶體複製就有機會是整體的效能瓶頸。</p>
<ol>
<li>作者認為若應用程式的緩衝區太大,沒有辦法符合當前系統架構上的 <strong>L1/L2/L3</strong> 快取。</li>
<li>很少有單一應用程式有辦法把整個網路環境中的頻寬都吃滿,造成壅塞。</li>
</ol>
<p>首先,針對第一個情形來說,我們要先探討複製大檔案跟複製很多小檔案的差距。<br>作者認為當經過一些運算時候,後者(很多小檔案)會更有機會留在快取中繼續使用,而大檔案很容易就會發生 <strong>Cache-Miss</strong>的事件而最終要從 <strong>Memory</strong> 中讀取。<br>作者也提到,對很多 <strong>RDMA</strong> 相關的應用程式(譬如 <strong>FaSST</strong> )來說,針對小檔案的檔案複製,會特別處理。該應用程式內會特別準備一塊空間來處理這些小檔案的複製,而這塊空間是個 <strong>page-locked</strong> 的記憶體空間。藉由這個行為減少每次對於小檔案都要去進行所謂的 <strong>pinning memroy</strong>(從虛擬記憶體空間映射到實際記憶體空間)產生的消耗。<br>接下來探討第二個情形,有一些應用程式(譬如 <strong>KV</strong> )是特別關注在封包延遲性方面的,這種應用程式通常都不會消耗整個網路頻寬,其要求的點都是在於<strong>每秒能夠處理多少封包</strong>,而大部分情況下,<strong>Key</strong>/<strong>Value</strong>這些資料都是小封包,大概是數<strong>KB</strong>左右。<br>此外,作者還提供了一個數據來強調這個情況。<br>當傳輸的緩衝區大小是 <strong>4KB</strong> 左右的,這時候大概傳輸可以達到 <strong>20-30 GB/s</strong>,而若緩衝區的大小是超過 <strong>4MB</strong> 時,這時候的傳輸只剩下 <strong>2-4 GB/s</strong>,主要是緩衝區太大的時候,這些封包都沒有辦法符合快取的大小,導致大量複製行為最終使得傳輸速度下降。<br>所以結論一下,只要當緩窗區的大小過大的時候,這時候很容易因為 <strong>Cache Miss</strong>而產生各種複製的行為,而這些複製行為就會導致整體效能下降。</p>
<p>為了解決這個問題,作者提出了一個 <strong>Unified Memory Alloccator</strong> 的機制,這個機制會去同時控管計算(<strong>computation</strong>)與傳輸(<strong>communication</strong>)兩個子系統內的緩衝區配置。<br>這個機制有兩大重點</p>
<ol>
<li>實作不同類型的記憶體配置,譬如當前記憶體是要給 <strong>RDMA</strong> 使用,還是當前本系統的 <strong>DMA</strong>。</li>
<li>解析 <strong>dataflow graph</strong> 中的資訊來決定當前節點的資料是要使用何種記憶體配置。</li>
</ol>
<p>此外,不論是 <strong>RDMA</strong> 或是 <strong>DMA</strong> 所產生的緩衝區都會同時在計算(<strong>computation</strong>)與傳輸(<strong>communication</strong>)兩個子系統內共同使用,直到兩個系統都不再使用該空間時,才會將該空間給釋放出來。</p>
<p>所以看到這邊可以大概想像一下作者到底要怎麼做了。<br>分析整個 <strong>dataflow graph</strong> 中的資料走向,盡可能的讓相同使用的資料只要使用一份緩衝區空間即可,然後透過 <strong>RDMA</strong> 或是 <strong>DMA</strong> 等技術來傳遞資料,減少整個過程中的資料複製行為。</p>
<h1 id="IMPLEMENTATION"><a href="#IMPLEMENTATION" class="headerlink" title="IMPLEMENTATION"></a>IMPLEMENTATION</h1><p>作者採用的 <strong>dataflow</strong> 是基於 <strong>tensorflow</strong>,因此該 <strong>Unified Memory Alloccator</strong> 本身也是實作在 <strong>tensorflow</strong> 裡面,可以直接到<a href="https://github.com/tensorflow/tensorflow/pull/11392" target="_blank" rel="noopener">下列位置</a>觀看作者與 <strong>tenforflow</strong> 維護者的溝通以及程式碼的修改。<br>作者新增了一種 <strong>memory allocator</strong> 到整體的程式碼內,要使用時只要打開相關選項即可(前提是要先針對有 <strong>RDMA</strong> 重新編譯整個專案)。</p>
<p>在作者的實作的記憶體分配器中,會自動的去解析 <strong>tensorflow</strong> 的 <strong>computational grpah</strong> 以及 <strong>distributed graph partition</strong>,所以只有滿足下列兩種條件的張量 <strong>tensor</strong> 才會去該記憶體分配器中被選擇使用 <strong>RDMA</strong>。</p>
<ul>
<li>必須是source node(出發端點) 或是 sink node(結尾端點)</li>
<li>該操作必須是 send/receive 同時要跨實體機器<br>這也很合理,因為跨機器間的傳輸會用到網路,所以才會需要用到 <strong>RDMA</strong> 來傳輸資料。</li>
</ul>
<p>在最原始的 <strong>TenforFlow</strong> 的版本中,使用了基於 <strong>HTTP/2</strong> 的 <strong>gRPC</strong> 格式作為 <strong>Tensor</strong> 間的傳輸。而作者修改了這邊的程式碼,使得這邊會直接跳過 <strong>RPC</strong> 的呼叫,改使用 <strong>RDMA</strong> 來傳輸資料。<br>此外,為了完整支援能夠透過 <strong>RDMA</strong> 來使用本地端或是遠端的 <strong>GPU</strong> 資源,作者還使用了 <strong>GPU direct RDMA</strong> 的技術來完成這些事情。藉由這個技術任何 <strong>PCI-e</strong> 的第三方裝置(譬如 <strong>NIC</strong> )都可以直接讀取 <strong>GPU</strong> 上面的記憶體空間。<br>此外作者也觀察到當 <strong>GPU direct RDMA</strong> 的路徑會經過 <strong>CPU-socket</strong> (譬如處於不同的 <strong>NUMA NODE</strong>) 會發生嚴重的效能問題。<br>因為在這種情況下,這些資料會先被送到記憶體內,然後在被複製出來,最後才會真正的送到 <strong>NIC</strong> 或是 <strong>GPU</strong> 上去處理,導致了不必要的消耗。</p>
<p>簡單來說,作者透過分析然後決定那些記憶體空間要共用,那些用<strong>DMA</strong>,那些用<strong>RDMA</strong>,同時透過 <strong>GPU direct RDMA</strong> 的技術直接存取遠方機器上面 <strong>GPU</strong> 的記憶體,藉此降低大量的資料複製行為。</p>
<h1 id="EVALUATION"><a href="#EVALUATION" class="headerlink" title="EVALUATION"></a>EVALUATION</h1><h3 id="Environment-Hardware"><a href="#Environment-Hardware" class="headerlink" title="Environment (Hardware)"></a>Environment (Hardware)</h3><ol>
<li>4 servers 都連接上 Mellanox MSN2100-BB2F 40Gbe RoCE Switch (For RDMA)</li>
<li>每個 server 都配置下列硬體<ul>
<li>Mellanox MT27500 40GbE NIC</li>
<li>Dual6-core Intel Xeon E5-2603v4 CPU</li>
<li>4 NVidia Tesla K40m GPUs</li>
<li>256 GB DDR4-2400MHz</li>
</ul>
</li>
<li>Switch 本身有配置 <strong>PFC</strong> 來控管傳輸流量降低封包掉落機率</li>
</ol>
<h3 id="Environment-Software"><a href="#Environment-Software" class="headerlink" title="Environment (Software)"></a>Environment (Software)</h3><ol>
<li>作者訓練了分散式版本的 <strong>VGG16</strong> CNN 模型。</li>
<li>模組的參數大小是 528 MB</li>
<li>採用了 <strong>synchronous</strong> 模式</li>
</ol>
<p><strong>parameter servers</strong> 的數量跟 <strong>Workers</strong> 的數量一至,同時<br>針對每一台機器上面的 <strong>Worker</strong> 都會同時使用 <strong>CPU</strong> 與 <strong>GPU</strong> 來進行運算,而 <strong>parameter server (PS)</strong> 則只會使用 <strong>CPU</strong> 配上系統上的記憶體來收集資訊。</p>
<h3 id="Target"><a href="#Target" class="headerlink" title="Target"></a>Target</h3><ol>
<li>作者修改後的 <strong>TensorFlow</strong></li>
<li>官方未修改的 <strong>TensorFlow</strong> <ul>
<li>v1.2.1</li>
</ul>
</li>
<li>Yahoo 自行修改後的 <strong>TensorFlow</strong><ul>
<li>也支援 RDMA,但是機制沒有作者完善,還是有不少的複製行為</li>
</ul>
</li>
</ol>
<h3 id="Metric"><a href="#Metric" class="headerlink" title="Metric"></a>Metric</h3><p>作者想觀察的是完成訓練所消耗的時間,</p>
<h3 id="Result"><a href="#Result" class="headerlink" title="Result"></a>Result</h3><ol>
<li>比較的結果來看,(1) 比 (2) 快上了 <strong>2.43</strong> 倍, 而 (1) 比 (3) 快上了 <strong>1.21</strong> 倍</li>
<li>16顆 <strong>GPU</strong> 與 1顆 <strong>GPU</strong> 的比較起來,效能提升了 <strong>13.8</strong>倍</li>
</ol>
<h1 id="Summary"><a href="#Summary" class="headerlink" title="Summary"></a>Summary</h1><p>作者觀察到在 <strong>dataflow</strong> 中之間的傳輸大小不小,同時這些資料會在系統中有大量的資料複製行為,因此引進了 <strong>DMA</strong>,<strong>RDMA</strong> 以及 <strong>GPU direct RDMA</strong> 等技術來減少整體的資料複製行為,並且也將整體的程式碼完全貢獻回 <strong>TensorFlow</strong> 內,未來任何人想要嘗試這個機制也可以直接使用。</p>
</div>
<div class="popular-posts-header">Related Posts</div>
<ul class="popular-posts">
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/paper-maglve.html" rel="bookmark">[論文導讀] Maglev: A Fast and Reliable Software Network Load Balancer</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/slides-high-performace-network.html" rel="bookmark">Slides - High Performance Network</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/nat-loopback.html" rel="bookmark">NAT Lookback Introduction</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2016-04-04-switchdev-iii.html" rel="bookmark">[Switchdev] How Kernel Implement SwitchDev(ii)</a></div>
</li>
<li class="popular-posts-item">
<div class="popular-posts-title"><a href="/2016-08-31-825029.html" rel="bookmark">mTCP 讀後筆記</a></div>
</li>
</ul>
<footer class="post-footer">
<div class="post-tags">
<a href="/tags/Network/" rel="tag"># Network</a>
<a href="/tags/Linux/" rel="tag"># Linux</a>
<a href="/tags/Paper/" rel="tag"># Paper</a>
<a href="/tags/RDMA/" rel="tag"># RDMA</a>
<a href="/tags/AI/" rel="tag"># AI</a>
<a href="/tags/TensorFlow/" rel="tag"># TensorFlow</a>
</div>
<div class="post-nav">
<div class="post-nav-next post-nav-item">
<a href="/jupyter-converter.html" rel="next" title="Translate jupyter notebook to python script">
<i class="fa fa-chevron-left"></i> Translate jupyter notebook to python script
</a>
</div>
<span class="post-nav-divider"></span>
<div class="post-nav-prev post-nav-item">
<a href="/introduce-cni-i.html" rel="prev" title="[Container Network Interface] Bridge Network In Docker">
[Container Network Interface] Bridge Network In Docker <i class="fa fa-chevron-right"></i>
</a>
</div>
</div>
</footer>
</div>
</article>
</div>
</div>
<div class="comments" id="comments">
<div id="disqus_thread">
<noscript>Please enable JavaScript to view the comments powered by Disqus.</noscript>
</div>
</div>
</div>
<div class="sidebar-toggle">
<div class="sidebar-toggle-line-wrap">
<span class="sidebar-toggle-line sidebar-toggle-line-first"></span>
<span class="sidebar-toggle-line sidebar-toggle-line-middle"></span>
<span class="sidebar-toggle-line sidebar-toggle-line-last"></span>
</div>
</div>
<aside id="sidebar" class="sidebar">
<div class="sidebar-inner">
<ul class="sidebar-nav motion-element">
<li class="sidebar-nav-toc sidebar-nav-active" data-target="post-toc-wrap">
Table of Contents
</li>
<li class="sidebar-nav-overview" data-target="site-overview-wrap">
Overview
</li>
</ul>
<div class="site-overview-wrap sidebar-panel">
<div class="site-overview">
<div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
<img class="site-author-image" itemprop="image"
src="/images/avatar.jpg"
alt="Hwchiu"/>
<p class="site-author-name" itemprop="name">Hwchiu</p>
<div class="site-description motion-element" itemprop="description">kubernetes/SDN/DevOps</div>
</div>
<nav class="site-state motion-element">
<div class="site-state-item site-state-posts">
<a href="/archives/">
<span class="site-state-item-count">157</span>
<span class="site-state-item-name">posts</span>
</a>
</div>
<div class="site-state-item site-state-tags">
<a href="/tags/">
<span class="site-state-item-count">91</span>
<span class="site-state-item-name">tags</span>
</a>
</div>
</nav>
<div class="feed-link motion-element">
<a href="/atom.xml" rel="alternate">
<i class="fa fa-rss"></i>
RSS
</a>