±à¼ÍƼö: |
±¾ÎÄÖ÷Òª½éÉÜÁË´óÊý¾Ý¼Ü¹¹¡¢Spark
MLib¡¢Parameter Server¡¢TensorflowÀëÏß·Ö²¼Ê½ÑµÁ·¡£
±¾ÎÄÀ´×ÔÓÚ¼òÊ飬ÓÉ»ðÁú¹ûÈí¼þAnna±à¼¡¢ÍƼö¡£ |
|
´óÊý¾Ý¼Ü¹¹
1.Åú´¦Àí
MapReduceÎÞ·¨Ó¦¶Ôʵʱ²»È·¶¨Á¿µÄСÑù±¾´¦Àí£¬Ö»ÄÜÀÛ»ýµ½Ò»¶¨ÊýÁ¿ÔÙ½øÐÐÅú´¦Àí¡£
2.Á÷¼ÆË㣨Storm£¬Spark£¬Flink£©
ʹÓû¬¶¯´°¿Ú£¬ÔÚ»¬¶¯´°¿ÚÄÚµÄÊý¾ÝÈ«²¿Íê³ÉºóÔÙ»¬¶¯µ½ÏÂÒ»¸öʱ¼ä´°¿Ú½øÐÐÐÂÒ»ÂÖµÄÊý¾Ý´¦Àí£¬ÒÔ·ÖÖÓ¼¶±ð¾Ó¶à¡£¶Ô²»Í¬Êý¾ÝÁ÷»¹ÄÜjoin£¬²¢ÔÚͬһ¸öʱ¼ä´°¿ÚÄÚ×öÕûºÏ´¦Àí¡£
»¹¿ÉÒÔ×÷ΪÏÂÓεÄÊäÈë¡£
Áé»î£¬ÑÓ³ÙС¡£µ«ÊÇÒ²Óн϶̴°¿ÚϵÄÈÕÖ¾ÂÒÐò£¬join²Ù×÷µÄÊý¾ÝÒÅ©µÄÎÊÌâ¡£
3.Lambda¼Ü¹¹£¨Á÷+Åú£©
ʵʱÁ÷¼ÆË㣨ÔöÁ¿¼ÆËãΪÖ÷±£Ö¤ÊµÊ±ÐÔ£©+ÀëÏßÅú´¦Àí£¨È«Á¿¼ÆËã±£Ö¤Ò»ÖÂÐÔ£©£¬ÔÚ´æÈë×îÖÕµÄÊý¾Ý¿â֮ǰ»¹»á½«ÊµÊ±Á÷Êý¾ÝÓëÀëÏßÊý¾ÝºÏ²¢¡£
4.Kappa¼Ü¹¹£¨½â¾ö¼ÆËãÈßÓࣩ
ºÜÃ÷ÏÔʵʱ¼ÆËãµÄ´úÂëÂß¼Æäʵ¿ÉÒÔ¸úÀëÏß¼ÆË㲿·Ö¹²Ïí¡£ËùÒÔ¿ÉÒÔ½«Åú´¦ÀíÒ²ÒÔÁ÷µÄ·½Ê½Ö´ÐС£±ÈÈçÅú´¦Àíʱ¼ä´°¿ÚÉèÖÃΪһÌ죬Á÷´¦Àí5·ÖÖÓ¡£
ʵÏÖÀëÏßÁ÷¼ÆËãµÄ˼·£º
£¨1£©ÔʼÊý¾Ý´æ´¢£ºÔ·â²»¶¯½«Î´¾Á÷¼ÆËãµÄÊý¾Ý¶ªµ½·Ö²¼Ê½ÎļþϵͳÖÐÂýÂý´¦Àí
£¨2£©Êý¾ÝÖØ²¥£º°´Ê±¼ä˳ÐòÖØ²¥£¬²¢ÓÃͬÑùµÄÁ÷´¦Àí¿ò¼Ü½øÐд¦Àí¡£
Spark MLib
·Ö²¼Ê½»úÆ÷ѧϰѵÁ·ÓÐÈý¸öÖ÷ÒªµÄ·½°¸£¬·Ö±ðÊÇSpark MLlib£¬Parameter ServerºÍTensorFlow£¬µ¹²»ÊÇ˵ËûÃÇÊÇΨÈý¿É¹©Ñ¡ÔñµÄƽ̨£¬¶øÊÇÒòΪËûÃÇ·Ö±ð´ú±í×ÅÈýÖÖÖ÷Á÷µÄ½â¾ö·Ö²¼Ê½ÑµÁ··½·¨¡£
Spark£¬ÊÇÒ»¸ö·Ö²¼Ê½µÄ¼ÆËãÆ½Ì¨¡£Ëùν·Ö²¼Ê½£¬Ö¸µÄÊǼÆËã½ÚµãÖ®¼ä²»¹²ÏíÄڴ棬ÐèҪͨ¹ýÍøÂçͨÐŵķ½Ê½½»»»Êý¾Ý¡£ÒªÇå³þµÄÊÇ£¬Spark×îµäÐ͵ÄÓ¦Ó÷½Ê½Êǽ¨Á¢ÔÚ´óÁ¿Á®¼Û¼ÆËã½ÚµãÉÏ£¬ÕâЩ½Úµã¿ÉÒÔÊÇÁ®¼ÛÖ÷»ú£¬Ò²¿ÉÒÔÊÇÐéÄâµÄdocker
container£»µ«ÕâÖÖ·½Ê½Çø±ðÓÚCPU+GPUµÄ¼Ü¹¹£¬»òÕß¹²ÏíÄÚ´æ¶à´¦ÀíÆ÷µÄ¸ßÐÔÄÜ·þÎñÆ÷¼Ü¹¹¡£

spark¼Ü¹¹
Spark³ÌÐòÓÉManager node½øÐе÷¶È×éÖ¯£¬ÓÉWorker Node½øÐоßÌåµÄ¼ÆËãÈÎÎñÖ´ÐУ¬×îÖÕ½«½á¹û·µ»Ø¸øDrive
Program¡£ÔÚÎïÀíµÄworker nodeÉÏ£¬Êý¾Ý»¹¿ÉÄÜ·ÖΪ²»Í¬µÄpartition£¬¿ÉÒÔ˵partitionÊÇsparkµÄ»ù´¡´¦Àíµ¥Ôª¡£
ÔÚÖ´ÐоßÌåµÄ³ÌÐòʱ£¬Spark»á½«³ÌÐò²ð½â³ÉÒ»¸öÈÎÎñDAG£¨ÓÐÏòÎÞ»·Í¼£©£¬ÔÙ¸ù¾ÝDAG¾ö¶¨³ÌÐò¸÷²½ÖèÖ´Ðеķ½·¨¡£Èçͼ2Ëùʾ£¬¸Ã³ÌÐòÏÈ·Ö±ð´ÓtextFileºÍHadoopFile¶ÁÈ¡Îļþ£¬¾¹ýһЩÁвÙ×÷ºóÔÙ½øÐÐjoin£¬×îÖյõ½´¦Àí½á¹û¡£

Ôڵõ½×îÖյļÆËã½á¹û֮ǰ£¬³ÌÐòÐèÒª½øÐÐreduceµÄ²Ù×÷£¬´Ó¸÷partitionÉÏ»ã×Üͳ¼Æ½á¹û£¬Ëæ×ÅpartitionµÄÊýÁ¿Öð½¥¼õС£¬reduce²Ù×÷µÄ²¢Ðг̶ÈÖð½¥½µµÍ£¬Ö±µ½½«×îÖյļÆËã½á¹û»ã×ܵ½master½ÚµãÉÏ¡£
ÕâÀïµÄshuffleÖ¸µÄÊÇËùÓÐpartition£¨Êý¾Ý·ÖƬ£©µÄÊý¾Ý±ØÐë½øÐÐÏ´ÅÆºó²ÅÄܵõ½ÏÂÒ»²½µÄÊý¾Ý£¬×îµäÐ͵IJÙ×÷¾ÍÊÇͼÖеÄgroupByKeyºÍjoin²Ù×÷¡£ÄÃjoin²Ù×÷À´Ëµ£¬±ØÐëͨ¹ýÔÚtextFileÊý¾ÝÖкÍhadoopFileÊý¾ÝÖÐ×öÈ«Á¿µÄÆ¥Åä²Å¿ÉÒԵõ½joinºóµÄdataframe¡£¶øgroupby²Ù×÷ÐèÒª¶ÔÊý¾ÝÖÐËùÓÐÏàͬµÄkey½øÐкϲ¢£¬Ò²ÐèҪȫ¾ÖµÄshuffle²ÅÄܹ»Íê³É¡£
ËùÒÔ¿ÉÒÔ˵shuffle£¨»ìÏ´£©ºÍreduce²Ù×÷µÄ·¢Éú¾ö¶¨ÁË´¿²¢Ðд¦Àí½×¶ÎµÄ±ß½ç¡£ÈçÏÂͼËùʾ£¬SparkµÄDAG±»·Ö¸î³ÉÁ˲»Í¬µÄ²¢Ðд¦Àí½×¶Î£¨stage£©¡£

±»shuffle²Ù×÷·Ö¸îµÄDAG stages
map£¬filterµÈ²Ù×÷½öÐèÒªÖðÌõµÄ½øÐÐÊý¾Ý´¦ÀíºÍת»»¾Í¿ÉÒÔ£¬²»ÐèÒª½øÐÐÊý¾Ý¼äµÄ²Ù×÷£¬Òò´Ë¸÷partitionÖ®¼ä¿ÉÒÔ²¢Ðд¦Àí¡£
ÐèҪǿµ÷µÄÊÇshuffle²Ù×÷ÐèÒªÔÚ²»Í¬¼ÆËã½ÚµãÖ®¼ä½øÐÐÊý¾Ý½»»»£¬·Ç³£ÏûºÄ¼ÆË㡢ͨÐż°´æ´¢×ÊÔ´£¬Òò´Ëshuffle²Ù×÷ÊÇspark³ÌÐòÓ¦¸Ã¾¡Á¿±ÜÃâµÄ¡£Ò»¾ä»°×ܽáSparkµÄ¼ÆËã¹ý³Ì¾ÍÊÇ£ºStageÄÚ²¿Êý¾Ý¸ßЧ²¢ÐмÆË㣬Stage±ß½ç´¦½øÐÐÏûºÄ×ÊÔ´µÄshuffle²Ù×÷»òÕß×îÖÕµÄreduce²Ù×÷¡£
´úÂëʾÀý£º
while (i <=
numIterations) { //µü´ú´ÎÊý²»³¬¹ýÉÏÏÞ
val bcWeights = data.context.broadcast(weights)
//¹ã²¥Ä£ÐÍËùÓÐÈ¨ÖØ²ÎÊý
val (gradientSum, lossSum, miniBatchSize) =
data.sample (false, miniBatchFraction, 42 + i).treeAggregate()
//¸÷½Úµã²ÉÑùºó¼ÆËãÌݶȣ¬Í¨¹ýtreeAggregate»ã×ÜÌݶÈ
val weights = updater.compute (weights, gradientSum
/ miniBatchSize) //¸ù¾ÝÌݶȸüÐÂÈ¨ÖØ
i += 1 //µü´ú´ÎÊý+1
} |
¾¹ý¾«¼òµÄ´úÂë·Ç³£¼òµ¥£¬SparkµÄmini batch¹ý³ÌÖÆ×÷ÁËÈý¼þÊ£º
°Ñµ±Ç°µÄÄ£ÐͲÎÊý¹ã²¥µ½¸÷¸öÊý¾Ýpartition£¨¿Éµ±×÷ÐéÄâµÄ¼ÆËã½Úµã£©
¸÷¼ÆËã½Úµã½øÐÐÊý¾Ý³éÑùµÃµ½mini batchµÄÊý¾Ý£¬·Ö±ð¼ÆËãÌݶȣ¬ÔÙͨ¹ýtreeAggregate²Ù×÷»ã×ÜÌݶȣ¬µÃµ½×îÖÕÌݶÈgradientSum
ÀûÓÃgradientSum¸üÐÂÄ£ÐÍÈ¨ÖØ
ÕâÑùÒ»À´£¬Ã¿´Îµü´úµÄStageºÍStageµÄ±ß½ç¾Í·Ç³£Çå³þÁË£¬StageÄÚ²¿µÄ²¢Ðв¿·ÖÊǸ÷½Úµã·Ö±ð²ÉÑù²¢¼ÆËãÌݶȵĹý³Ì£¬StageµÄ±ß½çÊÇ»ã×ܼӺ͸÷½ÚµãÌݶȵĹý³Ì¡£ÕâÀïÔÙÇ¿µ÷һϻã×ÜÌݶȵIJÙ×÷treeAggregate£¬¸Ã²Ù×÷ÊǽøÐÐÀàËÆÊ÷½á¹¹µÄÖð²ã»ã×Ü£¬Õû¸ö²Ù×÷Á÷³ÌÈçÏÂͼËùʾ¡£

ÊÂʵÉÏ£¬treeAggregateÊÇÒ»´Îreduce²Ù×÷£¬±¾Éí²¢²»°üº¬shuffle²Ù×÷£¬ÔÙ¼ÓÉϲÉÓ÷ֲãµÄÊ÷ÐβÙ×÷£¬ÔÚÿ²ãÖж¼ÊDz¢ÐÐÖ´Ðеģ¬Òò´ËÕû¸ö¹ý³ÌÊÇÏà¶Ô¸ßЧµÄ¡£
ÔÚµü´ú´ÎÊý´ïµ½ÉÏÏÞ»òÕßÄ£ÐÍÒѾ³ä·ÖÊÕÁ²ºó£¬Ä£ÐÍֹͣѵÁ·¡£Õâ¾ÍÊÇSpark MLlib½øÐÐmini batchÌݶÈϽµµÄÈ«¹ý³Ì£¬Ò²ÊÇSpark
MLlibʵÏÖ·Ö²¼Ê½»úÆ÷ѧϰµÄ×îµäÐÍ´ú±í¡£
Spark MLlib²¢ÐÐѵÁ·µÄ¾ÖÏÞÐÔ
ʹÓÃSpark MLlibѵÁ·¸´ÔÓÉñ¾ÍøÂçʱ£¬ÍùÍùÁ¦²»´ÓÐÄ£¬²»½öѵÁ·Ê±¼ä¹ý³¤£¬¶øÇÒÔÚÄ£ÐͲÎÊý¹ý¶àʱ£¬¾³£»á´æÔÚÄÚ´æÒç³öµÄÎÊÌâ¡£¾ßÌåÀ´½²£¬Spark
MLlibµÄ·Ö²¼Ê½ÑµÁ··½·¨ÓÐÏÂÃæ¼¸¸ö±×¶Ë£º
²ÉÓÃÈ«¾Ö¹ã²¥µÄ·½Ê½£¬ÔÚÿÂÖµü´úǰ¹ã²¥È«²¿Ä£ÐͲÎÊý¡£ÖÚËùÖÜÖªSparkµÄ¹ã²¥¹ý³Ì·Ç³£ÏûºÄ´ø¿í×ÊÔ´£¬ÌرðÊǵ±Ä£Ð͵IJÎÊý¹æÄ£¹ý´óʱ£¬¹ã²¥¹ý³ÌºÍÔÚÿ¸ö½Úµã¶¼Î¬»¤Ò»¸öÈ¨ÖØ²ÎÊý¸±±¾µÄ¹ý³Ì¶¼ÊǼ«ÏûºÄ×ÊÔ´µÄ¹ý³Ì£¬Õâµ¼ÖÂÁËSparkÔÚÃæ¶Ô¸´ÔÓÄ£ÐÍʱµÄ±íÏÖ²»¼Ñ£»
²ÉÓÃ×è¶ÏʽµÄÌݶÈϽµ·½Ê½£¨Ë®Í°Ð§Ó¦£©£¬Ã¿ÂÖÌݶÈϽµÓÉ×îÂýµÄ½Úµã¾ö¶¨¡£´ÓÉÏÃæµÄ·ÖÎö¿ÉÖª£¬Spark MLlibµÄmini
batchµÄ¹ý³ÌÊÇÔÚËùÓÐ½Úµã¼ÆËãÍê¸÷×ÔµÄÌݶÈÖ®ºó£¬Öð²ãAggregate×îÖÕ»ã×ÜÉú³ÉÈ«¾ÖµÄÌݶȡ£Ò²¾ÍÊÇ˵£¬Èç¹ûÓÉÓÚÊý¾ÝÇãбµÈÎÊÌâµ¼ÖÂij¸ö½Úµã¼ÆËãÌݶȵÄʱ¼ä¹ý³¤£¬ÄÇôÕâÒ»¹ý³Ì½«blockÆäËûËùÓнڵãÎÞ·¨Ö´ÐÐеÄÈÎÎñ¡£ÕâÖÖͬ²½×è¶ÏµÄ·Ö²¼Ê½ÌݶȼÆË㷽ʽ£¬ÊÇSpark
MLlib²¢ÐÐѵÁ·Ð§Âʽϵ͵ÄÖ÷ÒªÔÒò£»
Spark MLlib²¢²»Ö§³Ö¸´ÔÓÍøÂç½á¹¹ºÍ´óÁ¿¿Éµ÷³¬²Î¡£ÊÂʵÉÏ£¬Spark MLlibÔÚÆä±ê×¼¿âÀïÖ»Ö§³Ö±ê×¼µÄ¶à²ã¸ÐÖª»úÉñ¾ÍøÂçµÄѵÁ·£¬²¢²»Ö§³ÖRNN£¬LSTMµÈ¸´ÔÓÍøÂç½á¹¹£¬¶øÇÒÒ²ÎÞ·¨Ñ¡Ôñ²»Í¬µÄactivation
functionµÈ´óÁ¿³¬²Î¡£Õâ¾Íµ¼ÖÂSpark MLlibÔÚÖ§³ÖÉî¶Èѧϰ·½ÃæµÄÄÜÁ¦Ç·¼Ñ¡£
SparkµÄÎÊÌ⣺
Èç¹ûÏ£ÍûÔÚSparkÉÏѵÁ·Éî¶ÈѧϰģÐÍ£¬ÄãÓÐûÓиĽøSparkµÄ·½·¨£¿Ê¹ÓõÚÈý·½lib£¿»¹ÊÇÐÞ¸ÄSparkÔ´Â룿»¹ÊÇ×ÔÑÐSparkÄ£ÐÍ£¿£¨IntelµÄBigDLºÍÌÚѶµÄSpark
on Angel£©
°Ñworkerµ±×÷tfÖÐpserverµÄworker ͨ¹ýspark×öÊý¾Ý·Ö·¢
ÔÚѵÁ·Íê³ÉSparkÄ£Ðͺó£¬Ó¦¸ÃʹÓÃʲô·½Ê½½«SparkÄ£ÐÍdeployµ½ÏßÉÏ»·¾³£¬×öÏßÉϵÄʵʱinference£¿
¹ØÓÚ spark Ä£ÐÍ deploy µ½ÏßÉÏ×öʵʱ inference µÄÎÊÌâ¡£ÎÒÃÇÓÐ xgboost4j
µÄ spark °æ±¾ÑµÁ· xgboost Ä£ÐÍ£¬È»ºó dump ³Éµ¥»úµÄÄ£ÐÍ£¬ÏßÉÏÖ±½Ó¼ÓÔØÄ£Ð͵½ÄÚ´æÌṩ
serving ¡£²»¹ýÕâ¸öÄ£ÐͲ»ÊÇ spark mllib ÔÉúÖ§³ÖµÄ£¬ÖмäÄ£Ð͵ÄÐòÁл¯Ò²ÊÇÀûÓà xgboost
±¾ÉíÌṩµÄÓïÑÔÎ޹صĸñʽ¡£¸ü¶àµÄspark mllib µÄ³¡¾°»¹ÊÇÀëÏßѵÁ· spark Ä£ÐÍ£¬È»ºóÓÃÀ´×öÀëÏß
batch Ô¤²âµÄÈÎÎñ¡£
Spark¶ÔÓÚ¸ßάÀëÉ¢ÌØÕ÷Ö§³Ö²»¹»£¬´ó¸ÅÌØÕ÷µ½ÁË5ǧÍò£¬ÑµÁ·³ÌÐò¾Í»á¹Òµô¡£´ó¹«Ë¾»ù±¾¶¼ÊÇ»ùÓÚmpiµÄ·Ö²¼Ê½»úÆ÷ѧϰѵÁ·µÄÄ£ÐÍ¡£SparkÕâÖÖµ¥master½ÚµãµÄ¼Ü¹¹£¬º£Á¿Ï¡ÊèÌØÕ÷¿Ï¶¨»á¹ÒÔÚÌݶÈaggregateºÍ²ÎÊýbroadcastµÄ¹ý³ÌÖС££¨×îÖÕ»¹ÊǵÃÉ϶àmaster£©
Parameter Server

´øÕýÔò»¯ÏîµÄloss function
ÓÉÓÚ¹«Ê½ÖÐÕýÔò»¯ÏîµÄ´æÔÚÐèÒª»ã×ÜËùÓÐÄ£ÐͲÎÊý²ÅÄܹ»ÕýÈ·¼ÆË㣬Òò´Ë½ÏÄѽøÐÐÄ£ÐͲÎÊýµÄ²¢ÐÐѵÁ·£¬Òò´ËParameter
Server²ÉÈ¡Á˺ÍSpark MLlibÒ»ÑùµÄÊý¾Ý²¢ÐÐѵÁ·²úÉú¾Ö²¿Ìݶȣ¬ÔÙ»ã×ÜÌݶȸüвÎÊýÈ¨ÖØµÄ²¢Ðл¯ÑµÁ··½°¸¡£

Parameter ServerÓÉserver½ÚµãºÍworker½Úµã×é³É£¬ÆäÖ÷Òª¹¦ÄÜ·Ö±ðÈçÏ£º
£¨1£©server½ÚµãµÄÖ÷Òª¹¦ÄÜÊDZ£´æÄ£ÐͲÎÊý¡¢½ÓÊÜworker½Úµã¼ÆËã³öµÄ¾Ö²¿Ìݶȡ¢»ã×ܼÆËãÈ«¾ÖÌݶȣ¬²¢¸üÐÂÄ£ÐͲÎÊý
£¨2£©worker½ÚµãµÄÖ÷Òª¹¦ÄÜÊǸ÷±£´æ²¿·ÖѵÁ·Êý¾Ý£¬´Óserver½ÚµãÀÈ¡×îеÄÄ£ÐͲÎÊý£¬¸ù¾ÝѵÁ·Êý¾Ý¼ÆËã¾Ö²¿Ìݶȣ¬ÉÏ´«¸øserver½Úµã¡£

PS×ÜÁ÷³Ì£º
£¨1£©Ã¿¸öworkerÔØÈëÒ»²¿·ÖѵÁ·Êý¾Ý
£¨2£©worker½Úµã´Óserver½Úµãpull×îеÄÈ«²¿Ä£ÐͲÎÊý
£¨3£©worker½ÚµãÀûÓñ¾½ÚµãÊý¾Ý¼ÆËãÌݶÈ
£¨4£©worker½Úµã½«ÌݶÈpushµ½server½Úµã
£¨5£©server½Úµã»ã×ÜÌݶȸüÐÂÄ£ÐÍ
£¨6£©goto step2 Ö±µ½µü´ú´ÎÊýÉÏÏÞ»òÄ£ÐÍÊÕÁ²
¶ÔÓÚÏ¡ÊèLRÕâÖÖÄ£ÐÍ£¬¿ÉÒÔ¶ÔËüµÄ²ÎÊýpull»·½Ú½øÐÐÑ¡ÔñÐÔÀÈ¡·Ç0²ÎÊý¡£
ʵÔڵȲ»¼°£¬Äܲ»ÄÜÏÈËãÏÂÒ»²½£¿£¨Ò»ÖÂÐÔÓë²¢ÐÐЧÂÊÖ®¼äµÄÈ¡Éᣩ
PSÒì²½·Ç×è¶ÏʽÌݶÈϽµ£º½ÚµãÔÚ×öµÚ11´Îµü´ú£¨iter11£©¼ÆËãʱ£¬µÚ10´Îµü´úºóµÄpush&pull¹ý³Ì²¢Ã»ÓнáÊø£¬Ò²¾ÍÊÇ˵×îеÄÄ£ÐÍÈ¨ÖØ²ÎÊý»¹Ã»Óб»ÀÈ¡µ½±¾µØ£¬¸Ã½ÚµãÈÔʹÓõÄÊÇiter10µÄÈ¨ÖØ²ÎÊý¼ÆËãµÄiter11µÄÌݶȡ£

Òì²½ÌݶȸüÐÂ
Òì²½Ìݶȸüеķ½Ê½ËäÈ»´ó·ù¼Ó¿ìÁËѵÁ·ËÙ¶È£¬µ«´øÀ´µÄÊÇÄ£ÐÍÒ»ÖÂÐÔµÄɥʧ£¬Ò²¾ÍÊÇ˵²¢ÐÐѵÁ·µÄ½á¹ûÓëÔÀ´µÄµ¥µã´®ÐÐѵÁ·µÄ½á¹ûÊDz»Ò»Öµģ¬ÕâÑùµÄ²»Ò»Ö»á¶ÔÄ£ÐÍÊÕÁ²µÄËÙ¶ÈÔì³ÉÒ»¶¨Ó°Ïì¡£ËùÒÔ×îÖÕѡȡͬ²½¸üл¹ÊÇÒì²½¸üÐÂÈ¡¾öÓÚ²»Í¬Ä£ÐͶÔÓÚÒ»ÖÂÐÔµÄÃô¸Ð³Ì¶È¡£ÕâÀàËÆÓÚÒ»¸öÄ£Ðͳ¬²ÎÊýѡȡµÄÎÊÌ⣬ÐèÒªÕë¶Ô¾ßÌåÎÊÌâ½øÐоßÌåµÄÑéÖ¤¡£ 
¶àserver½ÚµãµÄÐͬºÍЧÂÊÎÊÌ⣨һÖÂÐÔhash·ÖÅäserver£©
µ¥master½Úµã×÷Ϊһ¸öÆ¿¾±½Úµã£¬ÊÜ´ø¿íÌõ¼þµÄÖÆÔ¼£¬·¢ËÍÈ«²¿Ä£ÐͲÎÊýµÄЧÂʲ»¸ß£»Í¬²½µØ¹ã²¥·¢ËÍËùÓÐÈ¨ÖØ²ÎÊý£¬Ê¹ÏµÍ³ÕûÌåµÄÍøÂç¸ºÔØ·Ç³£´ó¡£
PS²ÉÓÃÁËserver groupÄÚ¶àserverµÄ¼Ü¹¹£¬Ã¿¸öserverÖ÷Òª¸ºÔðÒ»²¿·ÖµÄÄ£ÐͲÎÊý¡£Ä£ÐͲÎÊýʹÓÃkey
valueµÄÐÎʽ£¬Ã¿¸öserver¸ºÔðÒ»¸ökeyµÄrange¾Í¿ÉÒÔÁË¡£

ÏÖÔÚijworker½ÚµãÏ£ÍûpullеÄÄ£ÐͲÎÊýµ½±¾µØ£¬worker½Úµã½«·¢ËͲ»Í¬µÄrange pullµ½²»Í¬µÄserver½Úµã£¬server½Úµã¿ÉÒÔ²¢Ðеķ¢ËÍ×Ô¼º¸ºÔðµÄweightµ½worker½Úµã¡£
TensorflowÀëÏß·Ö²¼Ê½ÑµÁ·
tf»ùÓÚÈÎÎñ¹ØÏµÍ¼½øÐÐÈÎÎñµ÷¶ÈºÍ²¢ÐмÆËã¡£
tfѵÁ··ÖÁ½²ã£¬Ò»²ãÊÇ·Ö²¼Ê½µÄPS¼Ü¹¹£¬Ò»²ãÊǵ¥»úµÄworker½ÚµãÄÚ²¿µÄCPU+GPUµÄ²¢ÐмÆËã¼Ü¹¹¡£
|