蟷ウ謌�29蟷エ蠎ヲ 蜊呈・ュ遐皮ゥカ隲匁枚
繝「繝舌う繝ォGPU豢サ逕ィ縺ョ縺溘a縺ョ豺ア螻、蟄ヲ鄙�
繝「繝�Ν繧ウ繝ウ繝舌�繧ソ縺ョ螳溽樟
髮サ豌鈴壻ソ。螟ァ蟄ヲ 諠��ア逅�キ・蟄ヲ驛ィ
邱丞粋諠��ア蟄ヲ遘� 繝。繝�ぅ繧「諠��ア蟄ヲ繧ウ繝シ繧ケ
1410009 豕� 陬戊イエ
Date:
蟷ウ謌�30蟷エ2譛�6譌・
Abstract:
iPhone繧貞ァ九a縺ィ縺吶k繝「繝舌う繝ォ遶ッ譛ォ縺ョ諤ァ閭ス縺ッ蟷エ縲�髄荳翫@鬮倥>貍皮ョ苓�蜉帙r謖√▽繧医≧縺ォ縺ェ縺」縺溘◆繧√∝ュヲ鄙呈ク医∩繝「繝�Ν縺九i豺ア螻、蟄ヲ鄙偵�謗ィ隲悶r繝「繝舌う繝ォ遶ッ譛ォ荳翫〒陦後≧縺薙→縺悟庄閭ス縺ィ縺ェ縺」縺ヲ縺阪◆縲ゅ@縺九@縲∵怙譁ー縺ョ繝阪ャ繝医Ρ繝シ繧ッ縺ッ譫晏�縺九l縺ョ縺ゅk繧ゅ�繧�ロ繝�ヨ繝ッ繝シ繧ッ縺梧キア縺上ヱ繝ゥ繝。繝シ繧ソ謨ー縺碁撼蟶ク縺ォ螟壹>繧ゅ�縺ィ縺ェ縺」縺ヲ縺翫j縲∽サ雁セ梧峩縺ォ隍�尅縺ェ繝阪ャ繝医Ρ繝シ繧ッ縺悟�迴セ縺吶k縺薙→縺御コ域Φ縺輔l繧九ゅ%縺ョ繧医≧縺ェ繝阪ャ繝医Ρ繝シ繧ッ繧偵Δ繝舌う繝ォ遶ッ譛ォ荳翫〒螳溯」�☆繧九◆繧√↓縺ッ髟キ譁�ク斐▽髮」隗」縺ェ繧ウ繝シ繝峨r譖ク縺丞ソ�ヲ√′縺ゅk縺溘a縺ォ莠コ謇九〒譖ク縺上%縺ィ縺ッ蝗ー髮」縺ァ縺ゅk縲ゅ◎縺薙〒譛ャ遐皮ゥカ縺ァ縺ッ縲∬ィ育ョ玲ゥ滉ク翫〒譌「蟄倥�豺ア螻、蟄ヲ鄙偵ヵ繝ャ繝シ繝�繝ッ繝シ繧ッChainer繧堤畑縺�※蟄ヲ鄙偵@縺滄圀縺ォ逕滓�縺輔l繧九Δ繝�Ν繝輔ぃ繧、繝ォ縺九i縲∵キア螻、蟄ヲ鄙偵�謗ィ隲悶r陦後≧Swift險隱槭�繧ウ繝シ繝峨r閾ェ蜍慕函謌舌☆繧九%縺ィ縺後〒縺阪k繧ウ繝ウ繝舌�繧ソChainer2S繧剃ス懈�縺励◆縲ゅ∪縺溘∝ョ滄ィ薙↓繧医▲縺ヲ豺ア螻、蟄ヲ鄙偵い繝励Μ繧ア繝シ繧キ繝ァ繝ウ縺ョ螳溯」�∈縺ョGPU蛻ゥ逕ィ縺ョ蠢�ヲ∵ァ繧堤、コ縺励∵キア螻、蟄ヲ鄙偵�貍皮ョ怜�逅�↓GPU縺ォ逕ィ縺�k螳溯」�婿豕輔↓縺、縺�※繧よッ碑シ�r陦後>縲∵怙驕ゥ縺ェ螳溯」�婿豕輔r譏弱i縺九↓縺励◆縲�
ImageNet Large Scale Visual Recognition Challenge 2012(ILSVRC2012)[#!imagenet!#]縺ォ縺翫>縺ヲAlexNet[#!alexnet!#]縺檎匱陦ィ縺輔l縲∵キア螻、蟄ヲ鄙偵′莉匁焔豕輔h繧翫b鬮倥>諤ァ閭ス繧堤、コ縺励※莉・髯阪∫判蜒剰ェ崎ュ倥d閾ェ辟カ險隱槫�逅�↑縺ゥ讒倥�↑蛻�㍽縺ォ縺翫>縺ヲ豺ア螻、蟄ヲ鄙偵′豕ィ逶ョ縺輔l縲∫�皮ゥカ縺檎屁繧薙↓陦後o繧後k繧医≧縺ォ縺ェ縺」縺溘よキア縺�ロ繝�ヨ繝ッ繝シ繧ッ讒矩�縺後h繧願ア翫°縺ェ迚ケ蠕エ繧定。ィ迴セ縺輔l鬮倥>邊セ蠎ヲ繧貞セ励k縺薙→縺後〒縺阪k縺溘a縲;oogLeNet[#!googlenet!#]繧СesidualNet[#!resnet!#]縺ョ繧医≧縺ェ豺ア縺剰、�尅縺ェ繝阪ャ繝医Ρ繝シ繧ッ縺悟�縺ヲ縺上k繧医≧縺ォ縺ェ縺」縺溘ゅ◎繧後◇繧後�繝阪ャ繝医Ρ繝シ繧ッ蝗ウ繧貞峙
縲∝峙
縺ォ遉コ縺吶�
縺セ縺溘√◎繧後→蜷梧凾縺ォ繝「繝舌う繝ォ遶ッ譛ォ繧�Ο繝懊ャ繝医∬�蜍暮°霆「霆翫↑縺ゥ縺ョ險育ョ励Μ繧ス繝シ繧ケ縺ョ髯舌i繧後◆遶ッ譛ォ縺ォ豺ア螻、蟄ヲ鄙偵r驕ゥ逕ィ縺吶k縺溘a縺ョ遐皮ゥカ繧よ焚螟壹¥縺輔l縺ヲ縺�k縲�
繝「繝舌う繝ォ遶ッ譛ォ遲峨〒縺ッ繝ェ繧「繝ォ繧ソ繧、繝�蜃ヲ逅�′驥崎ヲ√〒縺ゅj縲∵キア螻、蟄ヲ鄙偵�螟ァ驥上�貍皮ョ励r鬮倬溘↓蜃ヲ逅�☆繧句ソ�ヲ∵ァ縺後≠繧九ゅ@縺九@縲∵キア螻、蟄ヲ鄙偵�Graphics Processing Unit(GPU)繧定、�焚逕ィ縺�◆鬮倥>貍皮ョ怜�逅��蜉帙r蜑肴署縺ォ縺励◆繧ゅ�縺ァ縺ゅk縺溘a縲∬ィ育ョ励Μ繧ス繝シ繧ケ縺ョ髯舌i繧後◆遶ッ譛ォ縺ァ縺ョ螳溯」��蝗ー髮」縺ァ縺ゅk縲ゅ%縺ョ蝠城。後r隗」豎コ縺吶k縺溘a縺ォ繝代Λ繝。繝シ繧ソ謨ー縲∵シ皮ョ鈴㍼繧貞炎貂帙☆繧九◆繧√�繝阪ャ繝医Ρ繝シ繧ッ讒矩�繧�ィ育ョ玲婿豕輔↑縺ゥ縺梧焚螟壹¥髢狗匱縺輔l縺ヲ縺�k縲�
荳譁ケ縺ァ縲(Phone繧貞ァ九a縺ィ縺吶k繝「繝舌う繝ォ遶ッ譛ォ縺ッCentral Processing Unit(CPU)縲;PU縺ョ諤ァ閭ス縺悟ケエ縲�髄荳翫@縲�ォ倥>貍皮ョ苓�蜉帙r謖√▽繧医≧縺ォ縺ェ縺」縺溘◆繧√∝ュヲ鄙呈ク医∩繝「繝�Ν縺九i豺ア螻、蟄ヲ鄙偵�謗ィ隲悶r陦後≧縺薙→縺ッ繝「繝舌う繝ォ遶ッ譛ォ荳翫〒繧ょ茜逕ィ蜿ッ閭ス縺ィ縺ェ縺」縺ヲ縺阪◆縲�CPU縺ョ縺ソ縺ァ貍皮ョ励�蜃ヲ逅�r陦後≧螳溯」��謨ー螟壹¥蟄伜惠縺励;PU繧貞茜逕ィ縺励◆螳溯」�b迴セ繧後※縺阪※縺�k縲よキア縺上ヱ繝ゥ繝。繝シ繧ソ謨ー縺碁撼蟶ク縺ォ螟壹>繝阪ャ繝医Ρ繝シ繧ッ繧偵Δ繝舌う繝ォ遶ッ譛ォ縺ァ螳溯」�☆繧九◆繧√↓縺ッ縲∵シ皮ョ怜�逅��繧医j蜆ェ繧後◆GPU縺ョ蛻ゥ逕ィ縺梧アゅa繧峨l繧九ゅ∪縺溘∵怙鬮俶ァ閭ス繧堤、コ縺励※縺�k隍�尅縺ェ繝阪ャ繝医Ρ繝シ繧ッ繧��ォ倬溷喧繧貞峙縺」縺溘ロ繝�ヨ繝ッ繝シ繧ッ繧貞ョ溯」�@繧医≧縺ィ縺励◆蝣エ蜷医↓繧ウ繝シ繝峨′髟キ譁�喧縲�屮隗」蛹悶@縺ヲ縺励∪縺�ココ謇九〒譖ク縺上�縺ッ蝗ー髮」縺ァ縺ゅk縲�
Figure:
GoogLeNet縺ョ繝阪ャ繝医Ρ繝シ繧ッ蝗ウ([#!googlenet!#]繧医j蠑慕畑)
 |
Figure:
ResidualNet縺ョ繝阪ャ繝医Ρ繝シ繧ッ蝗ウ([#!resnet!#]繧医j蠑慕畑)
 |
譛ャ遐皮ゥカ縺ァ縺ッ縲∬ィ育ョ玲ゥ滉ク翫〒譌「蟄倥�豺ア螻、蟄ヲ鄙偵ヵ繝ャ繝シ繝�繝ッ繝シ繧ッChainer繧堤畑縺�※蟄ヲ鄙偵@縺滄圀縺ォ逕滓�縺輔l繧九Δ繝�Ν繝輔ぃ繧、繝ォ縺九i縲∵キア螻、蟄ヲ鄙偵�謗ィ隲悶r陦後≧Swift險隱槭�繧ウ繝シ繝峨→繝代Λ繝。繝シ繧ソ繝輔ぃ繧、繝ォ繧定�蜍慕函謌舌☆繧九%縺ィ縺後〒縺阪k繧ウ繝ウ繝舌�繧ソChainer2S繧剃ス懈�縺励(OS遶ッ譛ォ荳翫〒邁。蜊倅ク斐▽鬮倬溘↓豺ア螻、蟄ヲ鄙偵�謗ィ隲悶r蜿ッ閭ス縺ォ縺吶k縺薙→繧堤岼謖�☆縲ゅ%縺ョ譎ゅ,PU繧医j繧よシ皮ョ怜�逅��蜉帙�蜆ェ繧後※縺�kGPU繧貞茜逕ィ縺吶k縲�
譛ャ隲匁枚縺ョ讒区�縺ッ莉・荳九�繧医≧縺ォ縺ェ縺」縺ヲ縺�k縲�
1遶� 縺ッ縺倥a縺ォ
縺薙�遐皮ゥカ縺ョ閭梧勹縲∫岼逧�r險倩シ峨☆繧九�
2遶� 髢「騾」遐皮ゥカ
髢「騾」遐皮ゥカ繧堤エケ莉九☆繧九�
3遶� 豺ア螻、蟄ヲ鄙偵い繝励Μ繧ア繝シ繧キ繝ァ繝ウ縺ョ菴懈�謇矩��
譛ャ遐皮ゥカ縺ョ繧ウ繝ウ繝舌�繧ソChainer2S繧堤畑縺�◆豺ア螻、蟄ヲ鄙偵い繝励Μ繧ア繝シ繧キ繝ァ繝ウ縺ョ菴懈�謇矩��↓縺、縺�※隱ャ譏弱☆繧九�
4遶� 謇区ウ�
譛ャ遐皮ゥカ縺ョ謇区ウ輔↓縺、縺�※霑ー縺ケ繧九�
5遶� 螳滄ィ�
螳滄ィ灘�螳ケ縺ィ縺昴�邨先棡縺ォ縺、縺�※霑ー縺ケ繧九�
6遶� 閠�ッ�
螳滄ィ薙�邨先棡縺ォ蟇セ縺吶k閠�ッ溘r霑ー縺ケ繧九�
7遶� 縺セ縺ィ繧√→莉雁セ後�隱イ鬘�
蜈ィ菴薙�縺セ縺ィ繧√→莉雁セ後�隱イ鬘後↓縺、縺�※霑ー縺ケ繧九�
莉倬鹸
蛻ゥ逕ィ蜿ッ閭ス縺ェ繝弱�繝我ク隕ァ縺ィ螳滄ィ薙〒蠕励i繧後◆繝��繧ソ繧定ィ倩シ峨☆繧九�
繝「繝舌う繝ォ遶ッ譛ォ縺ァ縺ッ縲∬ィ育ョ玲ゥ溘↓豈斐∋縺ヲ險育ョ励Μ繧ス繝シ繧ケ繧�Γ繝「繝ェ螳ケ驥上↓螟ァ縺阪↑蛻カ髯舌′縺九°繧九ゅ◎縺ョ縺溘a縲√Δ繝舌う繝ォ遶ッ譛ォ縺ォ豺ア螻、蟄ヲ鄙偵r螳溯」�@繧医≧縺ィ縺励◆蝣エ蜷医↓貍皮ョ鈴㍼縺ョ螟壹&縺悟撫鬘後→縺ェ繧九ら音縺ォ縲√ロ繝�ヨ繝ッ繝シ繧ッ縺ョ蜷�ア、縺ョ荳ュ縺ァ逡ウ縺ソ霎シ縺ソ螻、縺ョ貍皮ョ励′蜈ィ菴薙�貍皮ョ玲凾髢薙�螟ァ驛ィ蛻�r蜊�繧√k縺溘a縲∫糞縺ソ霎シ縺ソ螻、縺ョ貍皮ョ励r鬮倬溷喧縺吶k縺薙→縺後∵キア螻、蟄ヲ鄙偵r繝「繝舌う繝ォ遶ッ譛ォ縺ォ螳溯」�☆繧倶ク翫〒驥崎ヲ√〒縺ゅj縲∽サ・荳九�繧医≧縺ェCNN縺ョ鬮倬溷喧縺ォ髢「縺吶k遐皮ゥカ縺瑚。後o繧後※縺�k縲�
縺セ縺溘√Δ繝舌う繝ォ遶ッ譛ォ荳翫〒豺ア螻、蟄ヲ鄙偵r螳溯」�☆繧九◆繧√↓縲∵里蟄倥�豺ア螻、蟄ヲ鄙偵ヵ繝ャ繝シ繝�繝ッ繝シ繧ッ荳翫↓險ュ險医@縲√Δ繝舌う繝ォ遶ッ譛ォ縺ク驕ゥ逕ィ縺励◆繧ゅ�繧�∵眠縺励¥繝「繝舌う繝ォ遶ッ譛ォ逕ィ縺ョ繝輔Ξ繝シ繝�繝ッ繝シ繧ッ繧帝幕逋コ縺吶k縺ェ縺ゥ謨ー螟壹¥縺ョ螳溯」�婿豕輔′蟄伜惠縺励∽サ・荳九�繧医≧縺ェ繧ゅ�縺後≠繧九�
Howard繧峨�縲∫糞縺ソ霎シ縺ソ螻、繧壇epthwise separable convolution[#!dsconvolution!#]縺ォ鄂ョ縺肴鋤縺医『idth multiplier縲〉esolution multiplier縺ョ2縺、縺ョ繝上う繝代�繝代Λ繝。繝シ繧ソ繧貞ー主�縺吶k縺薙→縺ォ繧医j縲�撼蟶ク縺ォ蟆上&縺ェ邊セ蠎ヲ菴惹ク九�莉」繧上j縺ォ繝阪ャ繝医Ρ繝シ繧ッ縺ョ貍皮ョ鈴㍼縺ィ繝代Λ繝。繝シ繧ソ謨ー繧貞、ァ蟷�↓蜑頑ク帙@縺歇#!mobilenet!#]縲Eepthwise separable convolution縺ッ縲�壼クク縺ョ逡ウ縺ソ霎シ縺ソ螻、繧堤ゥコ髢捺婿蜷代�逡ウ縺ソ霎シ縺ソ貍皮ョ励→繝√Ε繝阪Ν譁ケ蜷代�逡ウ縺ソ霎シ縺ソ貍皮ョ励�2縺、縺ョ逡ウ縺ソ霎シ縺ソ貍皮ョ励↓蛻�屬縺吶k縺薙→縺ァ縲∵シ皮ョ鈴㍼繧�8蛻��1遞句コヲ縺ォ貂帙i縺吶%縺ィ縺後〒縺阪k縲ゆサ・荳九�蝗ウ
縺ォ讎ら払蝗ウ繧堤、コ縺吶Xidth multiplier縺ッ縲√ロ繝�ヨ繝ッ繝シ繧ッ繧貞�菴鍋噪縺ォ繝√Ε繝阪Ν譁ケ蜷代↓髢「縺励※邵ョ蟆上☆繧九b縺ョ縺ァ縺ゅj縲〉esolution multiplier縺ッ縲∝�蜉帷判蜒上�繧オ繧、繧コ繧堤クョ蟆上☆繧九b縺ョ縺ァ縺ゅk縲ゅ%繧後i縺ョ繝上う繝代�繝代Λ繝。繝シ繧ソ繧貞ー主�縺吶k縺薙→縺ァ縲∝ョケ譏薙↓繝阪ャ繝医Ρ繝シ繧ッ繧定サス驥丞喧縲�ォ倬溷喧縺ァ縺阪k繧医≧縺ォ縺励◆縲�
Figure:
Depthwise Separable Convolution縺ョ讎ら払蝗ウ
 |
Ghosh縺ッ縲‥epthwise separable convolution[#!dsconvolution!#]縺ォ蜉�縺医√ヱ繝ゥ繝。繝シ繧ソ縺ョ驥阪∩縺悟香蛻�↓蟆上&縺�→縺阪↓蛻医j蜿悶kPruning繧�ヱ繝ゥ繝。繝シ繧ソ縺ョ繝上ヵ繝槭Φ隨ヲ蜿キ蛹悶 ̄arametric Rectified Linear Units(PReLU)縺ョ蛻ゥ逕ィ縲∝�邨仙粋螻、縺ョ莉」繧上j縺ォglobal average pooling繧堤畑縺�k縺ェ縺ゥ縺ョ蟾・螟ォ繧定。後≧縺薙→縺ァ縲∫イセ蠎ヲ繧定誠縺ィ縺吶%縺ィ縺ェ縺乗シ皮ョ鈴㍼繧貞炎貂帙@縺溘ロ繝�ヨ繝ッ繝シ繧ッ繧帝幕逋コ縺励◆[#!quicknet!#]縲�
豺ア螻、蟄ヲ鄙偵ヵ繝ャ繝シ繝�繝ッ繝シ繧ッ縺ァ蟄ヲ鄙偵@縺溘Δ繝�Ν繧段OS縺ァ菴ソ逕ィ縺吶k縺溘a縺ォ縲√ヵ繝ャ繝シ繝�繝ッ繝シ繧ッ閾ェ菴薙′iOS荳翫〒蜍穂ス懊☆繧九h縺�↓險ュ險医&繧後◆繧ゅ�縺ィ縺励※縲,affe for iOS1縲ゝensorFlow2縲^penCV3縺ェ縺ゥ縺後≠繧九ゅ∪縺溘∵里蟄倥�繝輔Ξ繝シ繝�繝ッ繝シ繧ッ荳翫↓險ュ險医&繧後√Δ繝舌う繝ォ縺ク縺ョ驕ゥ逕ィ縺瑚��縺輔l縺溘b縺ョ縺ィ縺励※Caffe24縺ェ縺ゥ縺後≠繧九ゅ@縺九@縲√%繧後i縺ッ蜈ィ縺ヲCPU縺ョ縺ソ繧貞茜逕ィ縺励◆貍皮ョ怜�逅�〒縺ゅk縲�
CoreML縺ッ縲(OS11縺九i譁ー縺励¥霑ス蜉�縺輔l縺滓ゥ滓「ー蟄ヲ鄙但PI鄒、縺ァ縺ゅk5縲よ里蟄倥�豺ア螻、蟄ヲ鄙偵ヵ繝ャ繝シ繝�繝ッ繝シ繧ッ縺ァ縺ゅkKeras繧Гaffe縺ェ縺ゥ縺ァ菴懈�縺励◆蟄ヲ鄙呈ク医∩繝「繝�Ν繧貞、画鋤繝��繝ォ繧堤畑縺�※mlmodel繝輔ぃ繧、繝ォ繧剃ス懊j縲√い繝励Μ繧ア繝シ繧キ繝ァ繝ウ縺ョ荳ュ縺ァ隱ュ縺ソ霎シ繧縺ョ縺ソ縺ァ縲∵キア螻、蟄ヲ鄙偵�謗ィ隲悶r邁。蜊倥↓螳溯」�☆繧九%縺ィ縺悟�譚・繧九�CoreML縺ッ縲√Δ繝�Ν縺ョ貍皮ョ励rCPU縲;PU縺ョ縺ゥ縺。繧峨〒蜃ヲ逅�☆繧九°繧定�蜍慕噪縺ォ蛻、譁ュ縺怜ョ溯。後☆繧九ゅ@縺九@縲∝ョ溯」�&繧後※縺�k繝ャ繧、繝、繝シ縺ョ遞ョ鬘槭�髯仙ョ壹&繧後※縺�※縲∝ッセ蠢懊&繧後※縺�↑縺�眠隕上↓髢狗匱縺輔l縺溘Ξ繧、繝、繝シ繧剃スソ逕ィ縺励◆縺��エ蜷医↓縲∽ス守エ夊ィ隱槭〒縺ゅkMetal Shading Language縺ァ繝ャ繧、繝、繝シ縺ョ蜃ヲ逅�r譖ク縺丞ソ�ヲ√′縺ゅk縺溘a縲�ォ伜コヲ縺ェ繧ケ繧ュ繝ォ縺瑚ヲ∵アゅ&繧後k縲�
Tanno繧峨�縲∝ュヲ鄙呈ク医∩繝「繝�Ν繝輔ぃ繧、繝ォ繧段OS荳翫〒蜍穂ス懷庄閭ス縺ォ縺吶k豺ア螻、蟄ヲ鄙偵Δ繝�Ν繧ウ繝ウ繝舌�繧ソ縲,affe2C(Chainer2C)繧帝幕逋コ縺励◆[#!caffe2c!#]縲ゅ%繧後�縲,affe(Chainer)縺ァ蟄ヲ鄙偵@縺溷セ後↓逕滓�縺輔l繧九ヱ繝ゥ繝。繝シ繧ソ繝輔ぃ繧、繝ォ縺九i縲√Δ繝舌う繝ォ遶ッ譛ォ縺ァ繧ょョ溯。悟庄閭ス縺ェC險隱槭�繧ウ繝シ繝峨r閾ェ蜍慕函謌舌☆繧九b縺ョ縺ァ縺ゅk縲ょ�縺ヲ縺ョ蟄ヲ鄙偵ヱ繝ゥ繝。繝シ繧ソ縺悟ョ壽焚驟榊�縺ィ縺励※C險隱槭さ繝シ繝峨↓邨�∩霎シ縺セ繧後∝ュヲ鄙呈ク医∩繝「繝�Ν繝輔ぃ繧、繝ォ繧貞ョ溯。後☆繧九◆繧√↓蠢�ヲ√↑繝輔ぃ繧、繝ォ繧貞�縺ヲ蜷ォ繧薙□C險隱槭さ繝シ繝峨r逕滓�縺吶k縲ゅ∪縺溘�ォ倬溷喧縺ョ蟾・螟ォ縺ィ縺励※im2col謫堺ス懊↓繧医j逡ウ縺ソ霎シ縺ソ貍皮ョ励r陦悟�遨阪〒險育ョ励〒縺阪k繧医≧縺ォ縺励�ォ倬溯。悟�貍皮ョ励Λ繧、繝悶Λ繝ェ縺ァ縺ゅkBLAS繧貞茜逕ィ縺吶k縺薙→縺ァSIMD(NEON)蜻ス莉、縲√�繝ォ繝√せ繝ャ繝�ラ蜃ヲ逅�r陦後▲縺ヲ縺�k縲ゅ@縺九@縲,affe2C(Chainer2C)縺ッiOS縺ィAndroid荳。蟇セ蠢懊〒縺ゅk縺溘aGPU縺ッ菴ソ逕ィ縺励※縺�↑縺��
縺昴%縺ァ譛ャ遐皮ゥカ縺ァ縺ッ縲�ォ伜コヲ縺ェ繧ケ繧ュ繝ォ繧貞ソ�ヲ√→縺励↑縺�Δ繝舌う繝ォ豺ア螻、蟄ヲ鄙偵い繝励Μ繧ア繝シ繧キ繝ァ繝ウ縺ョ菴懈�繧貞庄閭ス縺ィ縺吶k繧ウ繝ウ繝舌�繧ソ縺ョ菴懈�繧堤岼謖�☆縲ゅ∪縺溘(OS縺ォ迚ケ蛹悶☆繧九%縺ィ縺ォ繧医jCPU繧医j繧よシ皮ョ怜�逅��蜉帙�蜆ェ繧後◆GPU繧貞茜逕ィ縺励(OS荳翫〒縺ョ貍皮ョ励�鬮倬溷喧繧貞峙繧九�
譛ャ遐皮ゥカ縺ョ繧ウ繝ウ繝舌�繧ソ繧堤畑縺�◆豺ア螻、蟄ヲ鄙偵Δ繝舌う繝ォ繧「繝励Μ繧ア繝シ繧キ繝ァ繝ウ縺ョ菴懈�縺ョ謇矩��↓縺、縺�※隱ャ譏弱☆繧九�
- 蟄ヲ鄙堤畑繝��繧ソ繧サ繝�ヨ縺ョ逕ィ諢上☆繧九�
- 豺ア螻、蟄ヲ鄙偵ヵ繝ャ繝シ繝�繝ッ繝シ繧ッ縺ョChainer繧堤畑縺�※繝阪ャ繝医Ρ繝シ繧ッ繧貞ュヲ鄙偵@縲√Δ繝�Ν繝輔ぃ繧、繝ォ繧剃ス懈�縺吶k縲�
- 繧ウ繝ウ繝舌�繧ソChainer2S繧堤畑縺�※蟄ヲ鄙呈ク医∩縺ョ繝「繝�Ν繝輔ぃ繧、繝ォ縺九iSwift險隱槭�繧ウ繝シ繝峨→繝代Λ繝。繝シ繧ソ繝輔ぃ繧、繝ォ繧堤函謌舌☆繧九�
- iOS豺ア螻、蟄ヲ鄙偵い繝励Μ繧ア繝シ繧キ繝ァ繝ウ縺ョGUI驛ィ蛻��繧ウ繝シ繝峨r菴懈�縺吶k縲�
- 逕滓�縺励◆Swift險隱槭�繧ウ繝シ繝峨√ヱ繝ゥ繝。繝シ繧ソ繝輔ぃ繧、繝ォ縲;UI縺ョ繧ウ繝シ繝峨°繧峨い繝励Μ繧ア繝シ繧キ繝ァ繝ウ繧剃ス懈�縺吶k縲�
縺セ縺壹∬ィ育ョ玲ゥ滉ク翫〒豺ア螻、蟄ヲ鄙偵ヵ繝ャ繝シ繝�繝ッ繝シ繧ッ縺ァ縺ゅkChainer繧堤畑縺�※繝阪ャ繝医Ρ繝シ繧ッ繧貞ュヲ鄙偵@縲∝ュヲ鄙呈ク医∩繝「繝�Ν繝輔ぃ繧、繝ォ繧堤畑諢上☆繧九�Chainer縺ァ縺ッ縲√ロ繝�ヨ繝ッ繝シ繧ッ縺ァ荳蠎ヲ鬆�シ晄成險育ョ励r陦後≧縺ィ縲√ロ繝�ヨ繝ッ繝シ繧ッ縺ョ蜷�Ξ繧、繝、繝シ縺ッ繝√ぉ繝シ繝ウ縺ォ繧医▲縺ヲ郢九′繧九ゅ%繧後↓繧医j縲∝�蜉帙°繧峨ロ繝�ヨ繝ッ繝シ繧ッ繧帝■繧九%縺ィ縺悟庄閭ス縺ォ縺ェ繧翫∝推螻、縺ョ遞ョ鬘槭d繝代Λ繝。繝シ繧ソ縲√ヵ繧」繝ォ繧ソ繝シ繧オ繧、繧コ遲峨�諠��ア繧貞叙蠕励☆繧九ゅ%繧後i縺ョ諠��ア縺九i縲ヾwift險隱槭�繧ウ繝シ繝峨→繝代Λ繝。繝シ繧ソ繝輔ぃ繧、繝ォ繧堤函謌舌☆繧九ゅ∪縺溘√き繝。繝ゥ縺九i逕サ蜒上�蜿門セ励dGUI縺ョ繧ウ繝シ繝�ぅ繝ウ繧ー繧定。後>縲√ヱ繝ゥ繝。繝シ繧ソ繝輔ぃ繧、繝ォ縺ェ縺ゥ縺ィ蜷医o縺帙k縺薙→縺ァ豺ア螻、蟄ヲ鄙偵い繝励Μ繧ア繝シ繧キ繝ァ繝ウ繧剃ス懈�縺吶k縺薙→縺後〒縺阪k縲よキア螻、蟄ヲ鄙偵い繝励Μ繧ア繝シ繧キ繝ァ繝ウ縺ョ菴懈�縺ョ豬√l蝗ウ繧剃サ・荳九�蝗ウ
縺ォ遉コ縺吶�
Figure:
豺ア螻、蟄ヲ鄙偵い繝励Μ繧ア繝シ繧キ繝ァ繝ウ縺ョ菴懈�縺ョ豬√l
 |
Chainer縺ァ菴ソ逕ィ縺吶k逕サ蜒上↑縺ゥ縺ョ蜈・蜉帙d繝阪ャ繝医Ρ繝シ繧ッ縺ョ荳ュ髢灘�蜉帙↑縺ゥ縺ョ繝��繧ソ縺ッ縲∝腰縺ェ繧九�繧ッ繝医Ν縺ァ縺ッ縺ェ縺上∬ィ育ョ励げ繝ゥ繝輔r菫晄戟縺吶kVariable縺ァ讒区�縺吶k蠢�ヲ√′縺ゅk縲ゅ%縺ョVariable縺ィ縺�≧讒矩�菴薙r菴ソ逕ィ縺吶k縺薙→縺ォ繧医▲縺ヲ繝阪ャ繝医Ρ繝シ繧ッ縺ァ鬆�シ晄成險育ョ励r荳蠎ヲ陦後≧縺薙→縺ァ縲√ロ繝�ヨ繝ッ繝シ繧ッ縺ョ蜷�ヮ繝シ繝峨�繝√ぉ繝シ繝ウ縺ァ郢九′繧翫��シ晄成險育ョ励r縺吶k縺薙→縺悟庄閭ス縺ォ縺ェ繧九�
譛ャ遐皮ゥカ縺ァ縺ッ縲√%縺ョ讖溯�繧貞茜逕ィ縺励※縲∽ク蠎ヲ鬆�シ晄成險育ョ励r陦後≧縺薙→縺ァ繝阪ャ繝医Ρ繝シ繧ッ縺ョ蜷�ヮ繝シ繝峨r繝√ぉ繝シ繝ウ縺ァ郢九£繧九ゅ%繧後↓繧医j縲√ロ繝�ヨ繝ッ繝シ繧ッ縺ョ蜃コ蜉帙°繧牙ア樊ァcreator繧貞セ励k縺薙→縺ァ繝阪ャ繝医Ρ繝シ繧ッ譛蠕後�繝ャ繧、繝、繝シ縺後←縺ョ繧医≧縺ェ繝ャ繧、繝、繝シ縺ァ縺ゅk縺九r遏・繧九%縺ィ縺後〒縺阪k縲ゅ◎縺ョ繝ャ繧、繝、繝シ縺ョinputs[0]繧貞セ励k縺薙→縺ァ縺昴�繝ャ繧、繝、繝シ縺ク縺ョ蜈・蜉�(1縺、蜑阪�繝ャ繧、繝、繝シ縺ョ蜃コ蜉�)繧貞セ励k縺薙→縺後〒縺阪k縲ょ酔讒倥↓creator繧定ェソ縺ケ縺ヲ縺昴�蜈・蜉帙r霎ソ繧九%縺ィ繧堤ケー繧願ソ斐☆縺薙→縺ァ繝阪ャ繝医Ρ繝シ繧ッ蜈ィ縺ヲ繧帝■繧九ゅ%縺ョ譎ゅ√Ξ繧、繝、繝シ縺檎糞縺ソ霎シ縺ソ螻、繧��邨仙粋螻、縺ェ縺ゥ縺ョ蝣エ蜷医(nputs縺ョ繝ェ繧ケ繝医↓驥阪∩縺ィ繝舌う繧「繧ケ縺ョ繝代Λ繝。繝シ繧ソ繧呈干縺医※縺翫j縲(nputs[1]縺ォ驥阪∩縺ョ繝代Λ繝。繝シ繧ソ縲(nputs[2]縺ォ繝舌う繧「繧ケ縺ョ繝代Λ繝。繝シ繧ソ縺梧�シ邏阪@縺ヲ縺ゅk縲ゅ%繧後r蝗ウ隗」縺励◆繧ゅ�繧貞峙
縺ィ縺励※莉・荳九↓遉コ縺吶ゅ∪縺溘∫ー。蜊倥↑CNN縺ョ萓九r蝗ウ
縺ォ遉コ縺吶�
縺薙�繧医≧縺ォ繝阪ャ繝医Ρ繝シ繧ッ縺ョ蜃コ蜉帙°繧峨ロ繝�ヨ繝ッ繝シ繧ッ縺ョ譛蛻昴�繝ャ繧、繝、繝シ縺セ縺ァ繧定セソ繧翫√ロ繝�ヨ繝ッ繝シ繧ッ縺ョ蜷�Ξ繧、繝、繝シ縺ョ遞ョ鬘槭d繝代Λ繝。繝シ繧ソ縺ェ縺ゥ縺ョ諠��ア繧偵∪縺ィ繧√※1縺、縺ョ繝ェ繧ケ繝医→縺励※菴懈�縺吶k縲ゅ◎縺ョ繝ェ繧ケ繝医r逕ィ縺�※Swift險隱槭�繝阪ャ繝医Ρ繝シ繧ッ縺ョ繧ウ繝シ繝峨→繝代Λ繝。繝シ繧ソ縺ョ繝舌う繝翫Μ繝輔ぃ繧、繝ォ繧剃ス懈�縺吶k縲4wift險隱槭�繧ウ繝シ繝峨�菴懈�縺ォ縺、縺�※縺ッ縲�4.2遽縺ァ隱ャ譏弱☆繧九ゅヰ繧、繝翫Μ繝輔ぃ繧、繝ォ縺ッ縲∝推螻、縺ョ驥阪∩縺ィ繝舌う繧「繧ケ繧偵◎繧後◇繧悟�縺代※繝輔ぃ繧、繝ォ蛹悶☆繧九ゅ%縺ョ譎ゅ∫糞縺ソ霎シ縺ソ螻、縺ョ驥阪∩繝代Λ繝。繝シ繧ソ縺ョ繧キ繧ァ繧、繝励�[outputChannels][kernelHeight][kernelWidth][inputChannels]縲∝�邨仙粋螻、縺ョ驥阪∩縺ョ繧キ繧ァ繧、繝励�[outputChannels][inputChannels]縺ァ縺ゅk蠢�ヲ√′縺ゅk縲よウィ諢冗せ縺ィ縺励※縲∫糞縺ソ霎シ縺ソ螻、縺ョ逶エ蠕後�蜈ィ邨仙粋螻、縺ョ驥阪∩繝代Λ繝。繝シ繧ソ縺ョ繧キ繧ァ繧、繝励�逡ウ縺ソ霎シ縺ソ螻、縺ィ蜷梧ァ倥↓縲ーoutputChannels][kernelHeight][kernelWidth][inputChannels]縺ィ縺励↑縺代l縺ー縺ェ繧峨↑縺��
Figure:
Chainer縺ォ縺翫¢繧九ロ繝�ヨ繝ッ繝シ繧ッ讒矩�
 |
Figure:
CNN縺ョ萓�
 |
譛ャ遐皮ゥカ縺ァ菴懈�縺励◆繧ウ繝ウ繝舌�繧ソChainer2S縺檎函謌舌☆繧九ロ繝�ヨ繝ッ繝シ繧ッ縺ョ繧ウ繝シ繝峨�縲`etal Performance Shaders(MPS)繝輔Ξ繝シ繝�繝ッ繝シ繧ッ縺ョ荳驛ィ縺ァ縺ゅkMPSNNGraph繧ッ繝ゥ繧ケ繧貞茜逕ィ縺励※縺�k縲�MPS繝輔Ξ繝シ繝�繝ッ繝シ繧ッ縺ッ縲;PU荳翫〒逕サ蜒丞�逅�d陦悟�貍皮ョ励↑縺ゥ繧貞ョ溯。後&縺帙k險育ョ励き繝シ繝阪Ν縺ョ繝ゥ繧、繝悶Λ繝ェ縺ァ縺ゅj縲`PS繧剃スソ逕ィ縺吶k縺薙→縺ァ豺ア螻、蟄ヲ鄙偵�GPU螳溯。後r螳溽樟縺励※縺�k縲�MPSNNGraph縺ッ縲√ル繝・繝シ繝ゥ繝ォ繝阪ャ繝医Ρ繝シ繧ッ荳ュ縺ョ逕サ蜒上→繝輔ぅ繝ォ繧ソ繝弱�繝峨′譛驕ゥ蛹悶&繧後◆繧ー繝ゥ繝戊。ィ迴セ縺ァ縺ゅk縲ゅげ繝ゥ繝輔r讒狗ッ峨@縺滓凾縺ォ隗」譫舌&繧後√←縺ョ繝弱�繝峨′蜈・蜉帙↓蠢�ヲ√〒縺ゅj縲√←縺ョ繝弱�繝峨′蜃コ蜉帙→縺励※逕滓�縺輔l繧九°縺梧アコ縺セ繧九ゅ%繧後↓繧医j縲∝�蜉帙→縺励※逕滓�縺輔l繧九ヮ繝シ繝峨r險育ョ励☆繧九◆繧√↓蠢�ヲ√〒縺ェ縺�ヮ繝シ繝峨�辟。隕悶@縲√>縺上▽縺九�繝弱�繝峨�繝代ヵ繧ゥ繝シ繝槭Φ繧ケ蜷台ク翫�縺溘a縺ォ莉悶�繝弱�繝峨→蜀�Κ逧�↓騾」邨舌@縺溘げ繝ゥ繝輔→縺ェ繧九�
MPSNNGraph縺ョ螳溯」�セ九→縺励※VGG16[#!vgg16!#]縺ョ螳溯」�r蝗ウ
縺ィ縺励※莉・荳九↓遉コ縺吶�MPSCNNConvolutionDataSource髢「謨ー縺ォ繧医▲縺ヲ縲√ヰ繧、繝翫Μ繝輔ぃ繧、繝ォ縺九i驥阪∩繧�ヰ繧、繧「繧ケ縺ョ繝代Λ繝。繝シ繧ソ縺ョ繝ュ繝シ繝峨r陦後≧縲ゅ∪縺溘`PSCNNConvolutionDescriptor髢「謨ー縺ォ繧医▲縺ヲ縲∝�蜉帙メ繝」繝阪Ν繧��蜉帙メ繝」繝阪Ν縲√ヵ繧」繝ォ繧ソ繝シ繧オ繧、繧コ縲∵エサ諤ァ蛹夜未謨ー縺ェ縺ゥ縺ョ險ュ螳壹r陦後≧縲ゅ%繧後i�偵▽縺ョ髢「謨ー繧貞他縺ウ蜃コ縺僖ataSource髢「謨ー繧剃ス懈�縺吶k縺薙→縺ァ逡ウ縺ソ霎シ縺ソ螻、繧��邨仙粋螻、縺ョ繝弱�繝峨r螳溽樟縺励※縺�k縲ゅ%縺ョ譎ゅ∝�邨仙粋螻、縺ョMPSCNNConvolutionDescriptor縺ォ蜈・蜉帙☆繧九ヵ繧」繝ォ繧ソ繝シ繧オ繧、繧コ縺ッ1 x 1縺ィ縺吶k縲ゅ@縺九@縲∫糞霎シ縺ソ螻、縺ョ逶エ蠕後�蜈ィ邨仙粋螻、縺ァ縺ッ縲`PSCNNConvolutionDescriptor縺ォ蜈・蜉帙☆繧九ヵ繧」繝ォ繧ソ繝シ繧オ繧、繧コ縺ッkernelHeight x kernelWidth縺ィ縺励(nputChannels縺ッ蜑阪�逡ウ縺ソ霎シ縺ソ螻、縺ョoutputChannnels縺ィ縺吶k蠢�ヲ√′縺ゅk縲�
螳溯」�凾縺ョ蝠城。檎せ縺ィ縺励※莉・荳九�縺薙→縺梧嫌縺偵i繧後k縲�
- 繧ォ繝。繝ゥ縺九i縺ョ蜈・蜉帷判蜒上�繝√Ε繝阪Ν縺ッRGB縺ァ縲∝ュヲ鄙呈ク医∩繝「繝�Ν縺ッ蜈・蜉帷判蜒上�繝√Ε繝阪Ν縺沓GR縺ァ縺ゅk縺溘a縲ヽGB縺九iBGR縺ォ螟画鋤縺励↑縺代l縺ー縺ェ繧峨↑縺��
- 蟄ヲ鄙呈ク医∩繝「繝�Ν縺ァ縺ッ縲∝�蜉帷判蜒上°繧牙ュヲ鄙呈凾縺ョ繝��繧ソ繧サ繝�ヨ縺ョ蟷ウ蝮�、繧貞シ輔>縺溽判蜒上r蜈・蜉帙→縺励※縺�k縺溘a縲√き繝。繝ゥ縺九i縺ョ蜈・蜉帙°繧峨b蜷梧ァ倥↓蟷ウ蝮�、繧貞シ輔>縺溽判蜒上r蜈・蜉帙→縺励↑縺代l縺ー縺ェ繧峨↑縺��
- MPSBilinearScaleNode縺ォ繧医▲縺ヲ蜈・蜉帷判蜒上r繝ェ繧オ繧、繧コ縺励◆蝣エ蜷医∝�蜉帷判蜒上�蜷�ヴ繧ッ繧サ繝ォ蛟、縺�0縺九i255縺ァ縺ッ縺ェ縺�0縺九i1縺ォ豁」隕丞喧縺輔l繧九�
縺薙l繧峨�蝠城。檎せ繧偵〃GG16縺ョ譛蛻昴�逡ウ縺ソ霎シ縺ソ螻、縺ァ縺ゅkconv1縺ョ蜑阪↓逡ウ縺ソ霎シ縺ソ螻、conv0縺ィ縺励※螳溯」�☆繧九%縺ィ縺ァ縲�㍾縺ソ縺ョ貍皮ョ鈴Κ蛻�〒逕サ蜒上�繝√Ε繝阪Ν繧坦GB縺九iBGR縺ォ螟画峩縺ィ蜷�ヴ繧ッ繧サ繝ォ蛟、繧�0縺九i255縺ョ遽�峇縺ォ謌サ縺励√ヰ繧、繧「繧ケ縺ョ貍皮ョ鈴Κ蛻�〒蟄ヲ鄙呈凾縺ョ繝��繧ソ繧サ繝�ヨ縺ョ蟷ウ蝮�、繧貞シ輔¥縺薙→縺ォ繧医j隗」豎コ縺励※縺�k縲Donv0縺ョ讎ら払蝗ウ繧貞峙
縺ィ縺励※莉・荳九↓遉コ縺吶�
Figure:
MPSNNGraph繧堤畑縺�◆VGG16縺ョ螳溯」�
 |
Figure:
conv0縺ョ讎ら払蝗ウ
 |
繧「繝励Μ繧ア繝シ繧キ繝ァ繝ウ縺ョ螳溯。梧凾縺ォViewController繧ッ繝ゥ繧ケ蜀��viewDidLoad髢「謨ー縺悟他縺ウ蜃コ縺輔l縲√%縺ョ譎ゅ↓VGG16繧ッ繝ゥ繧ケ繧貞ョ溯。後☆繧九%縺ィ縺ァ縲∝峙
縺ョ驛ィ蛻�′蜻シ縺ウ蜃コ縺輔l縺ヲ繧ー繝ゥ繝輔′讒狗ッ峨&繧後k縲ゅ◎縺ョ蠕後√き繝。繝ゥ縺九i縺ョ蜈・蜉帙rMTLTexture縺ィ縺励※蜿励¢蜿悶▲縺滓凾縺ォ縲√◎縺ョTexture繧偵げ繝ゥ繝輔�WithSourceImages縺ィ縺励※蜈・蜉帙☆繧九%縺ィ縺ォ繧医▲縺ヲ繧ー繝ゥ繝輔r螳溯。後@縲∫オ先棡繧貞セ励k縺薙→縺後〒縺阪k縲�
譛ャ遐皮ゥカ縺ァ縺ッ縲(OS荳翫〒逕サ蜒剰ェ崎ュ倥す繧ケ繝�Β繧貞ョ溯」�@縲∵キア螻、蟄ヲ鄙偵�貍皮ョ怜�逅�↓CPU縺ョ縺ソ繧堤畑縺�◆螳溯」�→GPU縺ョ縺ソ繧堤畑縺�◆螳溯」��蜃ヲ逅�溷コヲ縺ォ髢「縺吶k豈碑シ�ョ滄ィ薙→縲∵キア螻、蟄ヲ鄙偵�貍皮ョ怜�逅�↓GPU繧堤畑縺�k3遞ョ縺ョ螳溯」�婿豕輔�蜃ヲ逅�溷コヲ縺ォ髢「縺吶k豈碑シ�ョ滄ィ薙��偵▽縺ョ螳滄ィ薙r陦後▲縺溘ゅ%縺薙〒縺ッ縺昴l縺槭l縺ョ螳滄ィ薙�險ュ螳壹→邨先棡繧堤、コ縺吶�
縺昴l縺槭l縺ョ螳滄ィ薙↓縺翫>縺ヲ縲∫判蜒剰ェ崎ュ倥い繝励Μ繧ア繝シ繧キ繝ァ繝ウ繧貞ョ溯」�@縲∬ェ崎ュ倥↓隕√@縺滓凾髢薙r豎ゅa繧九%縺ィ縺ァ豈碑シ�r陦後▲縺溘りェ崎ュ俶凾髢薙�縲∬ィ域クャ繧�20蝗櫁。後>縺昴�蟷ウ蝮�凾髢薙→縺励◆縲よシ皮ョ怜�逅�↓GPU繧堤畑縺�◆逕サ蜒剰ェ崎ュ倥い繝励Μ繧ア繝シ繧キ繝ァ繝ウ縺ッ縲,oreML縺ィMPS縺ィMPS繝ゥ繧、繝悶Λ繝ェ縺ョ1縺、縺ァ縺ゅkMPSNNGraph縺ョ3遞ョ縺ォ縺、縺�※縺昴l縺槭l螳溯」�@縺溘ゅ◆縺�縺励`PS縺ィMPSNNGraph縺ッ豺ア螻、蟄ヲ鄙偵�貍皮ョ怜�逅�r蜈ィ縺ヲGPU縺ョ縺ソ縺ァ陦後≧縺後,oreML縺ッ貍皮ョ怜�逅�r髫�阡ス縺励※陦後≧縺溘a縲∝�逅��荳驛ィ蛻�rCPU縺ァ陦後▲縺ヲ縺�k蜿ッ閭ス諤ァ縺後≠繧九よシ皮ョ怜�逅�↓CPU縺ョ縺ソ繧堤畑縺�◆螳溯」�→GPU縺ョ縺ソ繧堤畑縺�◆螳溯」��蜃ヲ逅�溷コヲ縺ォ髢「縺吶k豈碑シ�ョ滄ィ薙〒縺ッ縲∬ゥ穂セ。逕ィ繝�ヰ繧、繧ケ繧段Pad pro(9.7繧、繝ウ繝� A9X RAM2GB)縲∬ェ崎ュ倥ロ繝�ヨ繝ッ繝シ繧ッ繧但lexNet[#!alexnet!#]縺ィ縺励◆縲ょ�逅�rGPU縺ョ縺ソ縺ァ陦後≧逕サ蜒剰ェ崎ュ倥い繝励Μ繧ア繝シ繧キ繝ァ繝ウ縺ッMPSNNGraph繧堤畑縺�※螳溯」�@縲∝�逅�rCPU縺ョ縺ソ縺ァ陦後≧Chainer2C繧堤畑縺�※螳溯」�@縺溽判蜒剰ェ崎ュ倥い繝励Μ繧ア繝シ繧キ繝ァ繝ウ縺ィ豈碑シ�@縺溘よシ皮ョ怜�逅�↓GPU繧堤畑縺�k�鍋ィョ縺ョ螳溯」�婿豕輔�豈碑シ�ョ滄ィ薙↓縺翫>縺ヲ縺ッ縲∬ゥ穂セ。逕ィ繝�ヰ繧、繧ケ繧段Phone 8 Plus(A11 RAM3GB)縲∬ェ崎ュ倥ロ繝�ヨ繝ッ繝シ繧ッ繧歎GG16[#!vgg16!#]縺ィ縺励◆縲�
2縺、縺ョ螳滄ィ薙�蜈ア騾壹�險ュ螳壹→蜷�ョ滄ィ灘崋譛峨�險ュ螳壹r莉・荳九↓縺セ縺ィ繧√k縲�
MPSNNGraph繧堤畑縺�※AlexNet[#!alexnet!#]繝阪ャ繝医Ρ繝シ繧ッ縺ォ繧医k迚ゥ菴楢ェ崎ュ倥い繝励Μ繧ア繝シ繧キ繝ァ繝ウ繧剃ス懈�縺励∬ィ域クャ繧�20蝗櫁。後▲縺ヲ隱崎ュ俶凾髢甜msec]縺ョ蟷ウ蝮�r豎ゅa縺溽オ先棡繧定。ィ
縺ィ縺励※莉・荳九↓遉コ縺吶り。ィ
繧医j縲∵キア螻、蟄ヲ鄙偵�貍皮ョ怜�逅�rCPU縺ョ縺ソ縺ァ陦後▲縺溷�エ蜷医↓豈斐∋縺ヲGPU縺ョ縺ソ縺ァ陦後▲縺溷�エ蜷医�譁ケ縺檎エ�3.7蛟阪�騾溷コヲ縺ァ螳溯。悟庄閭ス縺ィ縺�≧邨先棡縺悟セ励i繧後◆縲�
Table:
AlexNet縺ォ繧医k迚ゥ菴楢ェ崎ュ倥�隱崎ュ俶凾髢� [msec]
螳溯」�婿豕� |
蟷ウ蝮�ェ崎ュ俶凾髢� |
|
|
Chainer2C[#!c2calex!#] |
134.9 |
|
|
MPSNNgraph |
36.4 |
|
|
MPSNNGraph縲`PS縲,oreML繧堤畑縺�※縺昴l縺槭lVGG16[#!vgg16!#]繝阪ャ繝医Ρ繝シ繧ッ縺ォ繧医k迚ゥ菴楢ェ崎ュ倥い繝励Μ繧ア繝シ繧キ繝ァ繝ウ繧剃ス懈�縺励∬ィ域クャ繧�20蝗櫁。後▲縺ヲ隱崎ュ俶凾髢甜msec]縺ョ蟷ウ蝮�r豎ゅa縺溽オ先棡繧定。ィ
縺ィ縺励※莉・荳九↓遉コ縺吶り。ィ
繧医j縲∵悽遐皮ゥカ縺ョ繧ウ繝ウ繝舌�繧ソChainer2S繧貞茜逕ィ縺励※菴懈�縺励◆MPSNNGraph繧貞茜逕ィ縺励※螳溯」�@縺溽黄菴楢ェ崎ュ倥い繝励Μ繧ア繝シ繧キ繝ァ繝ウ縺梧怙繧る溘>108.99[msec]縺ィ縺�≧邨先棡縺ィ縺ェ縺」縺溘�
Table:
VGG16縺ォ繧医k迚ゥ菴楢ェ崎ュ倥�隱崎ュ俶凾髢� [msec]
螳溯」�婿豕� |
蟷ウ蝮�ェ崎ュ俶凾髢� |
譛騾溯ェ崎ュ俶凾髢� |
譛驕�ェ崎ュ俶凾髢� |
CoreML |
144.87 |
134.47 |
151.00 |
MPS |
155.21 |
146.72 |
170.00 |
MPSNNGraph |
108.99 |
107.67 |
110.68 |
豺ア螻、蟄ヲ鄙偵�貍皮ョ怜�逅�rCPU縺ョ縺ソ縺ァ陦後▲縺溷�エ蜷医→GPU縺ョ縺ソ縺ァ陦後▲縺溷�エ蜷医→繧呈ッ碑シ�@縺溷ョ滄ィ鍋オ先棡縺九i縲∵シ皮ョ怜�逅�rCPU縺ョ縺ソ縺ァ陦後▲縺溷�エ蜷医↓豈斐∋縺ヲ貍皮ョ怜�逅�rGPU縺ョ縺ソ縺ァ陦後▲縺溷�エ蜷医�譁ケ縺檎エ�3.7蛟埼ォ倬溘〒縺ゅk縺薙→縺悟�縺九k縲ゅ%繧後�GPU縺靴PU繧医j繧ゅ�繧ッ繝医Ν貍皮ョ励d荳ヲ蛻怜�逅�↓驕ゥ縺励※縺�k縺九i縺ィ閠�∴繧峨l繧九ゅ◎縺ョ縺溘a縲、lexNet[#!alexnet!#]縺ァ謗ィ隲悶r荳蝗櫁。後≧譎ゅ↓蠢�ヲ√↑貍皮ョ鈴㍼縺檎エ�11蜆�屓縺ァ縺ゅj縲√◎繧後h繧翫b荳蝗槭�謗ィ隲悶↓蠢�ヲ√↑貍皮ョ鈴㍼縺悟「励∴繧九ロ繝�ヨ繝ッ繝シ繧ッ縺ォ縺翫>縺ヲ縺ッ螳溯。碁溷コヲ縺ョ蟾ョ縺梧峩縺ォ髢九¥縺薙→縺御コ域Φ縺輔l繧九ゅ%縺ョ縺薙→縺九i縲∵怙譁ー縺ョ豺ア縺�ロ繝�ヨ繝ッ繝シ繧ッ繧偵Δ繝舌う繝ォ遶ッ譛ォ荳翫↓螳溯」�☆繧句�エ蜷医↓縺ッ縲∵キア螻、蟄ヲ鄙偵�貍皮ョ怜�逅�↓GPU繧堤畑縺�◆螳溯」�r縺吶k蠢�ヲ√′縺ゅk縺ィ閠�∴繧峨l繧九�
豺ア螻、蟄ヲ鄙偵�貍皮ョ怜�逅�↓GPU繧堤畑縺�◆螳溯」�婿豕輔�驕輔>縺ォ繧医k蜃ヲ逅�溷コヲ繧呈ッ碑シ�@縺溷ョ滄ィ鍋オ先棡縺九i縲∝�縺ヲ貍皮ョ怜�逅�↓GPU繧堤畑縺�※縺�k縺ォ繧る未繧上i縺哺PSNNGraph縺ォ繧医k螳溯」�′蜿悶j蛻�¢騾溘>縺薙→縺悟�縺九k縲�CoreML縺ッ繝阪ャ繝医Ρ繝シ繧ッ蜀�Κ縺ョ蜃ヲ逅�r縺ゥ縺ョ繧医≧縺ォ陦後▲縺ヲ縺�k縺九′髫�阡ス縺輔l縺ヲ縺�k縺溘a莉雁屓縺ョ邨先棡縺ィ縺ェ縺」縺滓�遒コ縺ェ逅�罰縺ッ蛻�°繧峨↑縺�ゅ@縺九@縲`PSNNGraph縺ィMPS縺ィ縺ョ蟾ョ縺ッ縲`PSNNGraph縺後げ繝ゥ繝墓ァ矩�繧貞茜逕ィ縺励※縺�k縺薙→縺ァ縲∵シ皮ョ怜�逅��譛驕ゥ蛹悶′陦後o繧後>縺ヲ縺�k縺薙→縺ォ繧医k繧ゅ�縺�縺ィ莠域Φ縺ァ縺阪k縲ょセ薙▲縺ヲ縲�16螻、縺九i縺ェ繧儀GG16[#!vgg16!#]繝阪ャ繝医Ρ繝シ繧ッ繧医j繧よキア縺СesNet50[#!resnet!#]縺ェ縺ゥ縺ョ譛譁ー縺ョ繝阪ャ繝医Ρ繝シ繧ッ縺ァ縺ッ繧ー繝ゥ繝墓ァ矩�繧貞茜逕ィ縺励◆縺薙→縺ォ繧医k諱ゥ諱オ縺悟、ァ縺阪¥縺ェ繧九→閠�∴繧峨l繧九ゅ
豺ア螻、蟄ヲ鄙偵ヵ繝ャ繝シ繝�繝ッ繝シ繧ッ縺ョChainer繧堤畑縺�※險育ョ玲ゥ滉ク翫〒豺ア螻、蟄ヲ鄙偵�蟄ヲ鄙偵r陦後>縲∫函謌舌&繧後◆繝「繝�Ν繝輔ぃ繧、繝ォ縺九i繝阪ャ繝医Ρ繝シ繧ッ驛ィ蛻��Swift險隱槭�繧ウ繝シ繝峨→繝代Λ繝。繝シ繧ソ繧呈�シ邏阪@縺溘ヰ繧、繝翫Μ繝輔ぃ繧、繝ォ繧堤函謌舌☆繧九さ繝ウ繝舌�繧ソChainer2S繧剃ス懈�縺励◆縲ゅ%繧後↓繧医j縲(OS遶ッ譛ォ荳翫〒螳ケ譏薙↓豺ア螻、蟄ヲ鄙偵�謗ィ隲悶r陦後≧縺薙→繧貞庄閭ス縺ォ縺励◆縲ゅ∪縺溘`PSNNGraph繧堤畑縺�※豺ア螻、蟄ヲ鄙偵�貍皮ョ怜�逅�r蜈ィ縺ヲGPU縺ァ陦後≧縺薙→縺ァ縲〃GG16繝阪ャ繝医Ρ繝シ繧ッ[#!vgg16!#]縺ァ108.99[msec]縺ィ縺�≧鬮倬溷ョ溯。後r蜿ッ閭ス縺ォ縺励◆縲�
譛ャ遐皮ゥカ縺ァ陦後▲縺滓キア螻、蟄ヲ鄙偵�貍皮ョ怜�逅�rCPU縺ョ縺ソ縺ァ陦後▲縺溷�エ蜷医→GPU縺ョ縺ソ縺ァ陦後▲縺溷�エ蜷医�蜃ヲ逅�溷コヲ縺ョ豈碑シ�ョ滄ィ薙°繧峨、lexNet繝阪ャ繝医Ρ繝シ繧ッ[#!alexnet!#]縺ォ縺翫¢繧区耳隲匁凾髢薙′CPU縺ョ縺ソ縺ョ蝣エ蜷医h繧翫bGPU縺ョ縺ソ縺ョ蝣エ蜷医�譁ケ縺�3.7蛟埼ォ倬溘〒縺ゅj縲(OS荳翫↓豺ア螻、蟄ヲ鄙偵い繝励Μ繧ア繝シ繧キ繝ァ繝ウ繧貞ョ溯」�☆繧矩圀縺ョGPU蛻ゥ逕ィ縺ョ蠢�ヲ∵ァ繧堤、コ縺励◆縲ゅ∪縺溘∵シ皮ョ怜�逅�↓GPU繧堤畑縺�k螳溯」�婿豕輔�驕輔>縺ォ繧医k蜃ヲ逅�溷コヲ縺ョ豈碑シ�ョ滄ィ薙°繧峨(OS荳翫↓豺ア螻、蟄ヲ鄙偵い繝励Μ繧ア繝シ繧キ繝ァ繝ウ繧貞ョ溯」�☆繧区凾縺ォ縺ッ縲`PSNNGraph繧堤畑縺�k螳溯」�′譛驕ゥ縺ェ螳溯」�婿豕輔〒縺ゅk縺薙→繧呈�繧峨°縺ォ縺励◆縲�
迴セ蝨ィ縲∵悽遐皮ゥカ縺ァ菴懈�縺励◆繧ウ繝ウ繝舌�繧ソChainer2S縺ッResNet[#!resnet!#]縺ョ繧医≧縺ェ譫晏�縺九l縺ョ縺ゅk繝阪ャ繝医Ρ繝シ繧ッ縺ォ縺ッ蟇セ蠢懊@縺ヲ縺�↑縺�ゅ∪縺溘`PSNNGraph蛛エ縺ァ蟇セ蠢懊@縺ヲ縺�k繝ャ繧、繝、繝シ遞ョ鬘槭�蜈ィ縺ヲ縺ォ蟇セ蠢懊@縺ヲ縺�k繧上¢縺ァ縺ッ縺ェ縺�ゅ◎縺ョ縺溘a縲∽サ雁セ梧椌蛻�°繧後�縺ゅk繝阪ャ繝医Ρ繝シ繧ッ繧�h繧雁、壹¥縺ョ繝ャ繧、繝、繝シ縺ォ蟇セ蠢懊☆繧九%縺ィ縺ァ繧医j隍�尅縺ァ豺ア縺�ロ繝�ヨ繝ッ繝シ繧ッ繝「繝�Ν繧貞茜逕ィ蜿ッ閭ス縺ィ縺ェ繧翫∫黄菴楢ェ崎ュ倥�邊セ蠎ヲ蜷台ク翫r蝗ウ繧九%縺ィ縺後〒縺阪k繧医≧縺ォ縺ェ繧翫∫判蜒丞、画鋤縺ェ縺ゥ讒倥�↑繧ソ繧ケ繧ッ縺ョ豺ア螻、蟄ヲ鄙偵い繝励Μ繧ア繝シ繧キ繝ァ繝ウ縺碁幕逋コ蜿ッ閭ス縺ィ縺ェ繧九ゅh縺」縺ヲ縲√さ繝ウ繝舌�繧ソ縺ョ譫晏�縺九l縺ョ縺ゅk繝阪ャ繝医Ρ繝シ繧ッ縺ィ螟壹¥縺ョ繝ャ繧、繝、繝シ遞ョ縺ク縺ョ蟇セ蠢懊′隱イ鬘後→縺励※閠�∴繧峨l繧九�
譖エ縺ォ縲∫樟蝨ィMPSNNGraph縺ァ縺ッ閾ェ繧画眠隕上↓繝輔ぅ繝ォ繧ソ繝シ繝弱�繝峨r菴懈�縺吶k縺薙→縺ッ荳榊庄閭ス縺ァ縺ゅj縲∝�縺ヲ縺ョ繝輔ぅ繝ォ繧ソ繝シ縺ォ髢「縺吶k繝弱�繝峨′蟄伜惠縺励※縺�k繧上¢縺ァ縺ッ縺ェ縺�ゅ◎縺ョ縺溘a縲∫樟迥カ縺ァ縺ッ縺ゅ∪繧贋ク闊ャ逧�〒縺ェ縺�Ξ繧、繝、繝シ繧�眠隕上↓髢狗匱縺輔l縺溘Ξ繧、繝、繝シ縺ッMPSNNGraph縺ョ繧「繝��繝��繝医〒霑ス蜉�縺輔l繧九∪縺ァ菴ソ逕ィ縺吶k縺薙→縺ッ縺ァ縺阪↑縺�ゅ%繧後r隗」豎コ縺吶k縺溘a縺ォ縺ッ縲∝刈邂怜所縺ウ荵礼ョ励r陦後≧繝弱�繝峨d迴セ蝨ィ蛻ゥ逕ィ蜿ッ閭ス縺ェ繝輔ぅ繝ォ繧ソ繝シ繝弱�繝峨↑縺ゥ繧堤オ�∩蜷医o縺帙※蜷檎セゥ縺ョ貍皮ョ励r螳溯」�☆繧九→縺�≧譁ケ豕輔′縺ゅk縺後√%繧後r陦後≧縺ィ繧ウ繝シ繝峨′髱槫クク縺ォ髮」隗」縺ォ縺ェ縺」縺ヲ縺励∪縺�ゅ%繧後r繧ウ繝ウ繝舌�繧ソ蛛エ縺ァ逕滓�蜿ッ閭ス縺ォ縺吶k縺薙→縺ァ縲√←縺ョ繧医≧縺ェ繝阪ャ繝医Ρ繝シ繧ッ繝「繝�Ν縺ォ繧ょッセ蠢懷庄閭ス縺ィ縺吶k縺薙→繧りェイ鬘後→縺励※閠�∴繧峨l繧九�
No References!
- 逡ウ縺ソ霎シ縺ソ螻、縺ョ繝弱�繝�
- MPSCNNBinaryConvolutionNode
- MPSCNNConvolutionNode
- MPSCNNConvolutionTransposeNode
- 繝励�繝ェ繝ウ繧ー螻、縺ョ繝弱�繝�
- MPSCNNPoolingAverageNode
- MPSCNNDilatedPoolingMaxNode
- MPSCNNPoolingL2NormNode
- MPSCNNPoolingMaxNode
- MPSCNNPoolingNode
- 蜈ィ邨仙粋螻、縺ョ繝弱�繝�
- 縲MPSCNNBinaryFullyConnectedNode
- 縲MPSCNNFullyConnectedNode
- 豢サ諤ァ蛹夜未謨ー縺ョ繝弱�繝�
- 縲MPSCNNNeuronAbsoluteNode
- 縲MPSCNNNeuronELUNode
- 縲MPSCNNNeuronHardSigmoidNode
- 縲MPSCNNNeuronLinearNode
- 縲MPSCNNNeuronPReLUNode
- 縲MPSCNNNeuronReLUNNode
- 縲MPSCNNNeuronReLUNode
- 縲MPSCNNNeuronSigmoidNode
- 縲MPSCNNNeuronSoftPlusNode
- 縲MPSCNNNeuronSoftSignNode
- 縲MPSCNNNeuronTanHNode
- 縲MPSCNNNeuronNode
- 繧ス繝輔ヨ繝槭ャ繧ッ繧ケ螻、縺ョ繝弱�繝�
- 縲MPSCNNCrossChannelNormalizationNode
- 縲MPSCNNLocalContrastNormalizationNode
- 縲MPSCNNSpatialNormalizationNode
- 縲MPSCNNNormalizationNode
縲
- 繧「繝��繧オ繝ウ繝励Μ繝ウ繧ー螻、縺ョ繝弱�繝�
- 縲MPSCNNUpsamplingBilinearNode
- 縲MPSCNNUpsamplingNearestNode
- 繝ェ繧オ繝ウ繝励Μ繝ウ繧ー縺ョ繝弱�繝�
- 縲MPSNNBilinearScaleNode
- 縲MPSNNLanczosScaleNode
- 縲MPSNNScaleNode
- 縲MPSImageTransformProvider
- 邨仙粋髢「謨ー縺ョ繝弱�繝�
- 邂苓。薙ヮ繝シ繝�
- 縲MPSNNAdditionNode
- 縲MPSNNSubtractionNode
- 縲MPSNNMultiplicationNode
- 縲MPSNNDivisionNode
- 縲MPSNNBinaryArithmeticNode
- 繝吶�繧ケ繧ッ繝ゥ繧ケ
Table:
MPSNNGraph繧堤畑縺�◆螳溯」�↓縺翫¢繧帰lexNet縺ョ隱崎ュ俶凾髢� [msec]
螳溯」�婿豕� |
MPSNNGraph |
|
|
險域クャ1蝗樒岼 |
37.92 |
|
|
險域クャ2蝗樒岼 |
35.63 |
|
|
險域クャ3蝗樒岼 |
34.48 |
|
|
險域クャ4蝗樒岼 |
39.36 |
|
|
險域クャ5蝗樒岼 |
42.61 |
|
|
險域クャ6蝗樒岼 |
37.58 |
|
|
險域クャ7蝗樒岼 |
37.56 |
|
|
險域クャ8蝗樒岼 |
34.60 |
|
|
險域クャ9蝗樒岼 |
34.15 |
|
|
險域クャ10蝗樒岼 |
35.59 |
|
|
險域クャ11蝗樒岼 |
36.15 |
|
|
險域クャ12蝗樒岼 |
35.14 |
|
|
險域クャ13蝗樒岼 |
34.98 |
|
|
險域クャ14蝗樒岼 |
35.92 |
|
|
險域クャ15蝗樒岼 |
35.71 |
|
|
險域クャ16蝗樒岼 |
35.36 |
|
|
險域クャ17蝗樒岼 |
36.49 |
|
|
險域クャ18蝗樒岼 |
36.16 |
|
|
險域クャ19蝗樒岼 |
35.91 |
|
|
險域クャ20蝗樒岼 |
36.34 |
|
|
Table:
蜃ヲ逅�↓GPU繧堤畑縺�◆螳溯」�婿豕輔�VGG16縺ョ隱崎ュ俶凾髢� [msec]
螳溯」�婿豕� |
MPSNNGraph |
MPS |
CoreML |
險域クャ1蝗樒岼 |
108.01 |
154.58 |
138.32 |
險域クャ2蝗樒岼 |
108.10 |
163.07 |
145.33 |
險域クャ3蝗樒岼 |
109.17 |
150.04 |
145.99 |
險域クャ4蝗樒岼 |
110.39 |
157.56 |
140.88 |
險域クャ5蝗樒岼 |
109.74 |
162.90 |
144.74 |
險域クャ6蝗樒岼 |
110.68 |
154.69 |
147.91 |
險域クャ7蝗樒岼 |
110.12 |
149.14 |
144.85 |
險域クャ8蝗樒岼 |
109.27 |
155.21 |
151.00 |
險域クャ9蝗樒岼 |
107.67 |
151.92 |
143.00 |
險域クャ10蝗樒岼 |
110.34 |
156.71 |
134.47 |
險域クャ11蝗樒岼 |
108.67 |
146.72 |
144.98 |
險域クャ12蝗樒岼 |
107.61 |
149.02 |
144.54 |
險域クャ13蝗樒岼 |
108.74 |
152.56 |
143.45 |
險域クャ14蝗樒岼 |
108.90 |
170.00 |
147.29 |
險域クャ15蝗樒岼 |
108.44 |
155.56 |
150.01 |
險域クャ16蝗樒岼 |
108.70 |
150.81 |
149.05 |
險域クャ17蝗樒岼 |
109.00 |
152.90 |
140.75 |
險域クャ18蝗樒岼 |
108.92 |
153.52 |
152.26 |
險域クャ19蝗樒岼 |
109.00 |
157.03 |
142.53 |
險域クャ20蝗樒岼 |
108.31 |
160.23 |
146.03 |
Footnotes
- ... iOS1
- https://github.com/aleph7/caffe
- ...縲ゝensorFlow2
- https://www.tensorflow.org/mobile/
- ...縲^penCV3
- https://github.com/opencv/opencv/wiki/Deep-Learning-in-OpenCV
- ...縺ェ縺ゥ縺後≠繧九ゅ∪縺溘∵里蟄倥�繝輔Ξ繝シ繝�繝ッ繝シ繧ッ荳翫↓險ュ險医&繧後√Δ繝舌う繝ォ縺ク縺ョ驕ゥ逕ィ縺瑚��縺輔l縺溘b縺ョ縺ィ縺励※Caffe24
- https://github.com/caffe2/caffe2
- ...
CoreML縺ッ縲(OS11縺九i譁ー縺励¥霑ス蜉�縺輔l縺滓ゥ滓「ー蟄ヲ鄙但PI鄒、縺ァ縺ゅk5
- https://developer.apple.com/documentation/coreml