icfpc 2024 ãã¨ããã 3d è¨èªè¯ãã£ãã¨ãã話
ãã¨ãã¨éã ã£ãè¨æ¶ãããç²éã«ãªããæå¾ã« icfpc ã«ãã¸ã¡ã«åå ããã®ã£ã¦ãã¤ã ã£ãã£ããè»ç¼ãããã¤ï¼ãããã®æãã§ããæè¿ã® icfpc ã¯æã®è¨èã§è¨ãã¨ãã©ã½ã³ãããçãç¾ä»£èªã§è¨ã㨠AHC çãªå°è±¡ãæã£ã¦ãã¾ãããããã¯ä»ã§ãå«ãã§ã¯ãªãã®ã§ãããããã¼ã«ä»äºã§ãã©ã½ã³ã¿ã¹ã¯ããã£ã¦ãæéããªãã¦åãçµãã¦ããªãã¨ããç¶æ³ã ã¨ãã¡ãã£ã¨åå ããã¢ãããæ¹§ãã¥ããããããªæãã§ã
ãã¾ãä»åã¯å ¬å¼ãµã¤ãããå¼µããã¦ãç»åããªã³ã¯ããæããã« icfpc ã®ä¼èª¬åã§ããã¨ããã® 2006/2007 ãåç §ãã¦ããã®ã§ãæå¾ ããã£ãã®ã§ãããããããªãããä¼èª¬åã¨ããã®ã好ã¿ãã彿ã¨ä»ã®ã¬ãã«å·®ãåèªèº«ã®éå»ã®ç¾åããªããã®ãããããªå¹æããããã¨ã¯æãã¾ããã§ããããããå ¨ã¦ãã£ã´ããã¨ãã¦ãã主å¬è ãæä¸ããå´åã¨ããç¹ã§ã 2006/2007 ã¯ãã20å¹´ã§æå¤§ç´ã®ãã®ã§ãã£ããã¾ãããã¯ããªã確å®ã«ãããã¯ãããã§ã¯ãªãã§ãããããæ¬å½ã«ããã¯ãªãããã§ãããããããã°ã©ãã³ã°å¥½ãã ãã©ããããªã«æ¥½ãããã®ã ã£ãã®ãï¼ã£ã¦ãããããã¬ãã«ã®ä½é¨ã ã£ããã§ã
ã¾ãæ¬é¡ã® icfpc 2024 ãè²ã è¯ãã£ããããªã®ã§ãã (ã¡ããã¨å ¨ã¦ãçè§£ã§ããã¬ãã«ã§åå ã§ãã¦ãªã) ããã®ä¸ã«ãã£ã 3d ã¨ãã esolang ã¯å¤§å¤è¯ãã£ãã§ããæè¿ã®ãã¨ã¯ææ¡ã§ãã¦ããªãã®ã§ã X ã¨ããè¨èªã«ä¼¼ãè¦ç´ ãã£ãããçãªè©±ããããããªã®ã§ãããç§ãèªèãã¦ããä¸ã§ã¯ã esolang ã¨ãã¦ã¯ååºããããã ã£ãã®ã§ã¯ãªããã¨æã£ã¦ãã¾ã
åã 3d è¨èªãã°ãããã¨æã£ãã¨ããã¯ä»¥ä¸ã®ãããªç¹ã§ã
1. 2D 空éã«é
ç½®ããè¨èªã§ãã
2. æéé¡è¡ããã
3. 並åå®è¡ããã
4. çä¸å°½ã«ä¸ä¾¿ã§ãªãç¨åº¦ã®ä¸ä¾¿ã
1 ã¯ã¾ãããã®ã¾ãã¾ã§ãå㯠2D 空éã«å½ä»¤ãé ç½®ããè¨èªã好ãã§ããããã¯å¥½ã¿ã§ããã
2 ã¯ä¸çªãã«ãæ°è¦æ§ã ã¨æãã¾ããæéé¡è¡ãåãè¾¼ã esolang ã¯ä»ã«åå¨ããã¨æã (è¨æ¶ãè ã£ã¦ãã®ã§ç¢ºããè¨èã§æ¸ããªã) ãã§ãããä»åã® 3d è¨èªã»ã©ç¶ºéºãªå½¢ã§ esolang ã«åãè¾¼ãã ä¾ã¯â¦â¦ãã¶ããªãã¨æã£ã¦ãã¾ãããã£ããæãã¦ãã ãã
3 ããªãããã¡ã¤ã³ã¹ããªã¼ã è¨èªã¯ä¸¦åå®è¡ãåæã«å°ããã¤ãªã£ã¦ãã£ã¦ããã®ã«ã esolang ã¯åºæ¬ç´åå®è¡ãªã®ã¯ããµããããã¿ãããªæ°æã¡ããã£ã¦ãããããæå³ã§è¯ãã£ãã§ããã¾ã 3d è¨èªã¯ããã°ã©ã è¨èªã¨ããããã¯åè·¯ã®é ç·çãªæãå¼·ããåè·¯ã¨ãªãã¨èªç¶ã«ä¸¦åæ§ãåå¨ããã®ã¯ããã¯ãããã¨ããæ°ããã¾ãã
4 ã«ã¤ãã¦ãããªãç´°ãããå½ä»¤ã»ããã®å®ç¾©ãã»ã©è¯ãæãã§ãããå½ä»¤ãçºè¡ããããå¦ãã«ãã£ã¦å ¥åãæ¶ãããæ®ã£ããããã§ããã¨ããä¸ä¸å·¦å³ã§å¯¾ç§°æ§ããªãã®ã§ã´ã«ããããªãçèãå¿ è¦ã§ããã¨ãããã¨ãå ç®ã¨==ã¨!=ã¯ãããã大ãªãå°ãªãã®æ¯è¼ã¯ãªããã¿ãããªã®ã¯è¯ãã©ã¤ã³ã ã¨æãã¾ããâ¦â¦åã ã£ããé¤ç®ã¯äºåºåå½ä»¤ã«ããããªãã¨ããæ°ã¯ãã¾ã
PEP 703
https://peps.python.org/pep-0703/
Python ã® GIL å¤ã話ããããããæ¥½ããèªã¿ãã®ã§ãããåç §ã«ã¦ã³ãã®ã¨ãããä¸çªäººæ°ã ã¨æãã®ã§ãããä»ã®ã¨ãããè²ã è¯ãããããããããã¼ãããããã¨ããã¨ããããåé¡ãèµ·ããªãï¼ãã¨æã£ããæ¬¡ã®ç« ãããã§ããã説æããããã¿ãããªèªã¿ãã®ã¯å¤§å¤å¥½ãã§ã
- åç §ã«ã¦ã³ã: ãªãã¸ã§ã¯ãã£ã¦ããã®ã¯ä½ã£ãã¹ã¬ãããè§£æ¾ããã¨ããã®ãã»ã¨ãã©ãªãã ããããã®å ´åã¯ããã¯ããããªããããä»ã«æ¸¡ã£ããæ®éã®åç §ã«ã¦ã³ãã½ããããã¨ãã話ã Swift ã« 2018 å¹´ã«å°å ¥ããã 話ããããä»ã®ã¹ã¬ããã«æ¸¡ãããå¾ã§ DECREF ããã¨ä»ã¹ã¬ããç¨ã®åç §ã«ã¦ã³ããè² ã«ãªãããã®ã ãã©ããã®æã« queue ã«å ¥ããã¨ãããã¨ããã¦ããããããã®ã§ããªããããç¡ãã§ããæ¹æ³ã¯ãªãã®ããªãâ¦â¦ã¨
- Immortalize 㨠Deferred reference count: ãã£ã¨è§£æ¾ãããªããªãã¸ã§ã¯ãã¯ä¸æ»ã«ã㦠contention ãé¿ãããã»ã¨ãã©ã®å ´å cyclic ã«ãªããã¨ãç¥ããã¦ãããªãã¸ã§ã¯ã(ãããã¬ãã«ã®ã¢ã¸ã¥ã¼ã«ã颿°ãªã©)ãã refcount ãã㦠GC ä»»ãã«ãããã¨ã«ãã£ã¦ contention ãé¿ãã
- mimalloc: pymalloc 㯠GIL åæã§ã¹ã¬ããã»ã¼ãã«ããã®é¢åãªã®ã§ã mimalloc ã«å¤æ´ã mimalloc ã®å é¨ç¶æ ãè¦ããã¨ã§ã python ãèªå管çãã¦ã object ã®ãªã¹ãã¨ãã®ç®¡çã¯ãããªããªã£ããå¾ã§ä»ã®ã¡ãªãããåºã¦ãã
- GC: Stop the world ãããéä¸ã§ãã¹ãã©ã¯ã¿ã¨ãå¼ã¶ã¨ãããããã¯ãããã®ã§å¾ã§ãããã¨ããã¾ãããããçãªã concurrent 㯠writer barrier å ¥ããããªããã諦ãã generational 㯠refcount ããããããªãããï¼ã¨ããæãã§æ¤å»ãããã
- ã³ã³ãã: GIL ä»»ãã«ãã¦ãã¨ããããªãã¸ã§ã¯ãåä½ã®ããã¯ã«ããã list_a.extend(list.b) ã¿ãããªãè¤æ°ã®ãªãã¸ã§ã¯ããããã¨ããã¯é åºåé¡ã«ãªããªãï¼ã¨æã£ãããäºã¤ã® mutex ãåãã¦ã mutex ã®ã¢ãã¬ã¹é ã§ããã¯ãããã¦é¢æ°ãã¿ããªãå¼ã¹ã°å¤§ä¸å¤«ãã¨ãã話ãããããããåç´ã ããä»ã§ãããããã®ã ãããã©ããªãã»ã©ã¨ããã¢ã¤ãã¢
- 楽観ããã¯: list 㨠dict ã¯å¤§äºãªã®ã§ã getter ã¯æ¥½è¦³ããã¯ã§é«éåãããå¤åãåºããå¾ãããä¸åå¤ãã£ã¦ãªãããã§ãã¯ãããããªãã¤ã rwlock ã¯é ããã RCU ã«ããã¨ãããããã¾ãã®è©±
- 楽観ããã¯ã®ããã® mimalloc æ¹å¤1: python ãªãã¸ã§ã¯ãã¯å°ç¨ã®ãã¼ã«ã使ããããã«ãã£ã¦ããªãã¸ã§ã¯ãåã£ãå¾ã«ä»®ã«ä»ã¹ã¬ããã«ãã£ã¦è§£æ¾ãããã¨ãã¦ãã refcount 㯠refcount ã®ã¾ã¾ããªããªã PyObject ã®å é ã®æ¹ã®ã¬ã¤ã¢ã¦ãã¯å ±éã ãã (å®éã¯äºç¨®é¡ããããã)
- 楽観ããã¯ã®ããã® mimalloc æ¹å¤2: ã¨ã¯ãã munmap ãããããä»ã®ãµã¤ãºç¨ã®ãã¼ã«ã¨ãã¦åå©ç¨ããã¦ãã¾ãã¨å°ããæ¬¡ã® GC ã¾ã§ munmap ããªãããå®å ¨ã ãã¡ã¢ãªä½¿ç¨éãå¢ãããã®ã§ãã»ã©è¯ã sync é »åº¦ã§å®å ¨ãªã¿ã¤ãã³ã°ãä¿è¨¼ããæ¹æ³ãå®è£ ãããã°ãã¼ãã«ãª write ã«ã¦ã³ã¿ã¨ãåã¹ã¬ããã« read ã«ã¦ã³ã¿ãç¨æããã空ã£ã½ã®ãã¼ã«ãã§ãããããã®ãã¼ã«ã®çªå·ãä»ã® write ã«ã¦ã³ã¿ã¨ãã write ã«ã¦ã³ã¿ãã¤ã³ã¯ãªã¡ã³ããåã¹ã¬ããã¯æ¥½è¦³ããã¯ä¸ã§ãªãæã«ãæã write ã«ã¦ã³ã¿ã観測ãã¦èªåã® read ã«ã¦ã³ã¿ã«å ¥ãããããã¨ãå ¨ read ã«ã¦ã³ã¿ã®æå°ã®å¤ãã大ããçªå·ãæã¤ç©ºãã¼ã«ã¯æ¨ã¦ã¦è¯ããã¨ãªã
è¡åéºä¼å¦
社ä¼çã«æåãã人ã¯ãéºä¼çã«æå©ã ã£ãã®ããç°å¢ãè¯ãã£ãã®ããæ¬äººãé å¼µã£ãã®ããç¯ç½ªãç¯ãã人ã¯ãå 天çã«ãªã«ããã£ãã®ããæè²ãç°å¢ãæªãã£ãã®ãããããããããã¨ãæ°ã«ãªãã¾ããã¨ãã©ããã®æã®ãã¨ãèãããã³ãã«ãªããããªæ¬ã¨ããèªãã§ã¿ãããã¦ãã®ã§ãããå人ããæãã¦ããã£ãæ¬ã®ãããã§ãè¡åéºä¼å¦ã¨ããã¸ã£ã³ã«ãããã®æã®ãããã¯ã«ç§å¦çãªã¢ããã¼ãã§åãçµãã ããã¦ããã½ããã¨ãããã¨ãç¥ãã¾ãããã¨ããããã§ãå¬ä¼ã¿ã®èªç±èª²é¡çã«è²ã èªãã ããã¦ã¿ãã®ã§ããªããè²ã ã¨æ¸ãã¦ã¿ã¾ã
çµè«ããæ¸ãã¦ããã¨ãæåã«ããããããªçåã¯ãè¡åéºä¼å¦ãå¦ã¶ãã¨ã«ãã£ã¦å®å ¨ã«è§£æ±ºãããã¨ãããã¨ã¯ãªãããã§ããã§ãããããããããã£ã¦ãããã¨ããããèãããã³ãã«ãªããã¨ããããããåç©«ããªãã¨æã£ã¦ãã¾ã
èªãã ãã®
- Introduction to Human Behavioral Genetics (https://www.coursera.org/learn/behavioralgenetics): Coursera ã§ãã Coursera ã¯æ°ãããã¨å¦ã¶ã«ã¯æå¼·ã§ããã³ã¬ã¨ããæãã§ããä»ã¾ã§è¦ã Coursera ã¯å ¨é¨ããã ã£ãã®ã§ããããããåç»ã«ãã¦é ä¿¡ãããã¨ããã ããã£ã¦ãããããæ´ç·´ãããè¬ç¾©ã¨ããæãã§ããããããããæ¥½ããããé常ã«è¯ãã£ããä½è«ã§ããå㯠Coursera ã§æ©æ¢°å¦ç¿ã®è¬ç¾©ãã£ãã ãã§ AI 人æããããã£ã¦ãã¾ã
- å¿ã¯ã©ã®ããã«éºä¼ããã (https://www.amazon.co.jp/gp/product/B00GHHYDIU/): å°éã®å çã人éè¡åéºä¼å¦ã«ã¤ãã¦ããããããæ¸ããæ¬ã§ã Coursera ãé¤ãã°ä¸çªè¯ãã£ããã®ã§ãããç§å¦ç主張ã«ã¡ãã£ã¨èè ã®æããæ··ãã£ã¦ããï¼ã¨ããæè¦ãåããã¨ãããããã¾ãã
- ãªãããã¯å¦ã¶ã®ããæè²ãçç©å¦çã«èãã (https://www.amazon.co.jp/gp/product/B07H7HXV91/): âã¨åãå çãããå°ãæ°æ¸ã½ããå¦ç¿ã«éä¸ãã¦æ¸ãããã¨ããæããã¨æãã¾ãããã£ã¡ã¯ããæããä¹ã£ã¦ãããããªå°è±¡ãæã£ã¦ãã¾ã
- è¨ã£ã¦ã¯ãããªãâæ®é ·ãããçå®â (https://www.amazon.co.jp/gp/product/B01E6JQBD0/): è¡åéºä¼å¦ã®ç¥è¦ãã»ã³ã»ã¼ã·ã§ãã«ã«æ¸ããæ°æ¸ã¨ããæããããã¾ã§ã§ãæããä¹ã£ã¦ãããã¿ãããªãã¨ãæ°ã«ãã¦ããçç±ããã®æ¬ãªã®ã§ãããåºã¦ããçµæã«å¯¾ãã¦èè ãè§£éãä¸ãã¦ããéãå¤ãããããã«æãã¾ããã X ã¨ããçµæãåºãæã«ã A ã¨ã B ã¨ãè§£éã§ããæã«ã A ã ã¨æãã¦è«ãããããªæãã¨ãããããããã¯æ°æ¸ã«ãããããè¡æçãªä¸ä¾ãç´¹ä»ãã¦ããã®ãµã³ãã«ãä¸è¬åããã¨ãã§ãããç§å¦çã«çæ¯ã«ãªãã¨ãã©ããã¦ãæ¯ã«è¡£çããæ¸ãããã«ãªãå¾åãããããã®æ¬ã¯ãããç¡ãã®ã§ãçå¿«ãªè§£èª¬ã«ãªã£ã¦ãã¦ãèªã¿ç©ã¨ãã¦ã¦ã±ãããªæãã ãªã¼ã¨æãã¾ã
- è¡åéºä¼å¦å ¥éâåç©ã¨ããã®âãããâã®ç§å¦ (https://www.amazon.co.jp/gp/product/4785358475/): ä»ã¨éã£ã¦ã人é以å¤ã®è¡åéºä¼å¦ã«ã¤ãã¦ã7å²ããããç·è«ã¨ããã¦ã¹ã¨ãã¯å«ççãªå¶ç´ãããããéºä¼åããã¯ã¢ã¦ããã¦å¤§éã«çããå¢ãããé«éã¤ãã¬ã¼ã·ã§ã³ãã¨ãã®ã¯ã¶ã使ãã¦ä¾¿å©ããã ãªã¨ãåºä¹³é¡ã¨ãã«å¯¾ãã¦ãè¡åéºä¼å¦ç ç©¶ããããããã®ã ãã©ãããã¯ä¾¿å©ã§ããªãã人éè¡åéºä¼å¦ã®ããã«å®ç¨çã§ããªãã®ã§ãç ç©¶ãå°ãªãããããã¾ããããã¨ãã
ãããã Coursera ã®è¬ç¾©ã§é¢ç½ãã£ããã¨ã«ã¤ãã¦æ¸ããã¨ã«ãªãã¨æãã¾ã
è¡åéºä¼å¦ã¨ã¯ããã®æ´å²
éºä¼å¦çãªã¢ããã¼ãã使ã£ã¦è¡ãªããå¿çå¦ã®ä¸åéããããã§ããç¾ä»£çãªå½¢ã«ãªãã¾ã§ã«ã¡ãã£ã¨æé»ã®æä»£ãããã¾ã
é²åè«ã®ãã¼ã¦ã£ã³ã®ãã¨ãã§ããã¨ããã®ã´ã«ãã³ã¨ãã人ãåªçå¦ãå§ããã¨ããã«ç«¯ãçºãã¾ããåªçå¦ã¯ããªããããã¹â¦â¦ãã¨ãããã¤ã¡ã¼ã¸ã§ããã彿ã¯ä¸ççãªæµè¡ã ã£ãã¨ã®ãã¨ããã®æ²¡è½ã¯ããç¥ããã¦ããéããã¦ã¼ã¸ã¼ã³ã¨ããååã¯åªçå¦ (eugenics) ã®æ²¡è½ã¨åææã«æ¸ã£ã¦ãããã¨ãããã°ã©ããé¢ç½ãã£ãã§ã

ãã®å¾ãåªçå¦ãã¼ã ã®åçãããä»åº¦ã¯éã®æ¹ã®æ¥µç«¯ã«åããç°å¢ã§å ¨ã¦ã決ã¾ãã¨ä¸»å¼µããã®ã人éçã§ããããããè¯å®ãããã¨ãç§å¦çã«ãæ£ãããã¨ããé°å²æ°ãä½ããã¾ãããè¡ãã¨ããã¾ã§è¡ã£ãã±ã¼ã¹ã¨ãã¦ç´¹ä»ããã¦ããã®ã John Joan case ã¨ãããã¤
ããååãçã¾ããæã«å²ç¤¼æè¡ããã¦ãçæ¹ã§å¤±æãã¦ç·æ§å¨ããã¡ã«ãªã£ã¦ãã¾ãã¾ãããæ²ãã親ãããã«ã¢ããã¤ã¹ãããç°å¢ãå ¨ã¦ãè«è ã®æ¨©å¨ã§ãã£ãå»è ãããããæè¡ãã¦å¥³æ§åããã®ã§ã Joan (女æ§å)ã¨ãã¦è²ã¦ãªããããã®ä»¶ã«é¢ãã¦æ¬äººã«ã¯ä¼ãã¦ã¯ãããªãã大ä¸å¤«ã人éã¯ç°å¢ãå ¨ã¦ãªã®ã§æ§ãå¤ããããããã®æãã«å¿ å®ã«è²ã¦ãä¸¡è¦ªãæ¨©å¨ã®å»è ã¯å¤§æåã¨è«æãæ¸ãã¾ããã§ãããæ¬äººã¯èªæ®ºé¡ææã¤ç¨åº¦ã«éåæãæã(ä»ã®æè¦ã§èããã¨è¦ããã«æ§å䏿§é害ã¨ãããã¨ããªã¨çè§£)ã両親ã¯ç§å¯ãæãããæ¬äººã¯ååº¦ç·æ§ã«ãªãæè¡ãåãã¾ãããããããã£ã¦ãé¢é£ã¯å®ãã§ã¯ãªãã§ãã(ããã«æ±ºã¾ã£ã¦ãã¨ããæ°ããã¾ãã)ãå Joan ããã¯èªæ®ºãã¦ãã¾ã£ã¦ãã¾ã
John/Joan ã¯ç ç©¶ç´¹ä»ã«ä½¿ãããä»®åã§ãæ¬åã® Wikipedia ã¨ã³ããªã¼ãããã¾ã(ãªãã Coursera ã§ç´¹ä»ããã話ããããã¶ãã¨ã°ã): https://en.wikipedia.org/wiki/David_Reimer
ããã¶ãã¨éè®ãªè©±ã«æãã¾ãããã 1965 å¹´ã¨ãã§ãæ¯è¼çæè¿ãªãã ãªãã¨
éºä¼åã§å ¨ã¦ã決ã¾ããé¸å¥ããããã¯å«ççã«ãã¤ããããç§å¦çã«ãæ£ãããªãã£ãããç°å¢ã ãã§æ±ºã¾ããã¨ããã®ãç§å¦çã«æ£ãããªããã¤ããªãã®ã¼å è¡ã§ç§å¦ããã£ã¡ããããªããã¨ããããããæè¨ãããã«ããã¨ããæãã§ã
ãã®å¾ãã¿ãã¼ã½ããªã£ã¦ããéºä¼ã«é¢ããç ç©¶ã許ãããé°å²æ°ã«ãªãã¾ããè¡åéºä¼å¦ã®æ¹æ³ã§ç¹°ãè¿ã確èªããããã¨ã¯ãããã¦ãã®ãã¨ã«é¢ãã¦ãç¨åº¦ã®å·®ã¯ãããéºä¼ãç°å¢ãã©ã£ã¡ã大äºã½ããã¨ãããã¨ãé常ã«ç´æçã¨ããããã¾ããããã¯ããã ãããã¨ããæãã§ã¯ããã¾ãããã ãä¸éçã«ã¯ãåªçå¦ãã¡çµ¶å¯¾ããå¼·ããã°ãã¨ãã¦åå¨ããã®ã§ãä¾ãã°ãIQ ã«ã¯éºä¼ã®å½±é¿ããããã¨è¨ãã¨æ»æããããã¿ãããªã®ããã£ã¦ãã©ã¤ãã¨ããæããããã§ãããã®ãã©ã¿ã¸ã®åè«ã¯ç´¹ä»ãã忏ã«ãã¤ãããããããããæ¸ããã¦ãã¾ãã
ååæ³ãªã©ã®æ¹æ³è«
ç·è«ã¨ãã§ããã°ãéºä¼åãæ¬ æããã¦æ§åãè¦ããã¨ãã許ãããã®ã§ããã人éã«å¯¾ãã¦ã¯ãè¯ãæè²ãåããç¾¤ã¨æªãæè²ãåãã群ãä½ããã¨ãã§ãã人権åé¡ã§ããã¨ããããã§èªç¶ã¨ã§ããå·®ãæå¹å©ç¨ããããç¡ãã®ã§ãããããã§æãå½¹ã«ç«ã£ã¦ããã®ãååã®ããã§ã
ä¸åµæ§åçå ã¯ãéºä¼åçã«ã¯å®å ¨ã«åä¸ãªã®ã§ãä¸åµæ§åçå ã®éã§å·®ãããå ´åãããã¯å ¨ã¦ç°å¢èµ·å ã§ããã¨ãããã¨ãè¨ãã¾ããããããæãã§ã人ã®å·®ãä½èµ·å ãï¼ããã¢ãã«åãããã®ã¨ãã¦ã Falconer model ã¨ãããã®ããããå·®ãä½ãè¦å ããéºä¼ç (A) ãå ±æç°å¢ (C) ãéå ±æç°å¢ (E) ã®3ã¤ã«åè§£ãã¾ããã人ã®å·®ãåºãè¦å ã¯éºä¼ãç°å¢ã§ãããã¯çã ãããããç°å¢ã¯å å¼ãªã©ã§å ±æãããç°å¢ã¨ãåéé¢ä¿ãªã©å ±æãããªãç°å¢ãã«ããããããã¨è¨ããã¦ããã¾ããããã¨æãã¾ã
ãã® A 㨠C 㨠E ãå®å ¨ã«åä¸ãªãç¸é¢ä¿æ°ã¯ 1 ã«ãªãã ããã¨ãããã¨ã§ã A + C + E = 1.0 ã¨èãã¾ããããã使ãã¨è²ã ãªæ¹æ³ã§é£ç«æ¹ç¨å¼ãä½ããã¨ãã話ã«ãªãã¾ããä¾ãã°ä¸åµæ§åçå ãããããè¦ã¦ã身é·ã®ç¸é¢ä¿æ°ã 0.92 ã§ãã£ãã¨ããã¨
0.92 = A + C
ãªã®ã§ E = 0.08 ã¨ãªãã¾ããä¸åµæ§åçå ã¯éºä¼åãå®å ¨ã«åä¸ã§ãå ±æç°å¢ããã®å®ç¾©ããä¸è´ãã¦ããã®ã§ãæ®ãã¯éå ±æç°å¢ E ã®å½±é¿ã§ããããã¨
次ã«äºåµæ§åçå ã§ã¯èº«é·ã®ç¸é¢ã 0.56 ã§ãã£ãå ´åãäºåµæ§åçå ã¯éºä¼åãååå ±æãã¦ããã®ã§
0.56 = 0.5 * A + C
é£ç«æ¹ç¨å¼ãè§£ã㨠A = 0.72 㨠C = 0.20 ãã¨ãªãã¾ã
ãã®è«çãçè§£ & ç´å¾ã§ãã¾ããã§ãããããåã¯ã¾ãã§ç´å¾ã§ãã
1. ããããç¸é¢ä¿æ°ã¦è¶³ãããå¼ãããå¦çã§ãããã®ï¼
2. äºåµæ§åçå
ã®éºä¼çã®å½±é¿ã¦å³å¯ã« 0.5 ã§è¯ãã®ï¼
3. ããç°¡åã« A ã 1 è¶ããã C ãè² ã«ãªããã©å¤§ä¸å¤«ï¼
ãªã©ã®çåããã£ã¨æ®ãç¶ãã¾ãããå¼ã追ã£ãããã¦ããªãã®ã§ãå®å ¨ã«çè§£ã¯ãã¦ããªãã®ã§ãããããç¨åº¦ã¯ç´å¾ããã¤ããã§ãã 1 ã«ã¤ãã¦ã¯åæ£ãè©ä¾¡ãã¦ãã®ã§ OK ã¨ãã話ã§ã 2 ã¯éºä¼è¦å ã®ç¨®é¡ã«ä¾åããã 0.5 ã§è¯ãç¹æ§ãå¤ãããããã 3 ã¯å®éè«æã®å®é¨çµæã¨ãè¦ãã¨ãç´ ç´ã«è¨ç®ãã㨠C ã è² ã«ãªããããªãã¼ã¿ãçµæ§ããã®ã§ããããããã®å ´å C ã 0 ã«ã¯ãªãããã¦ãããã«è¦ãããã©ããã®ç¹æ§ã«å¯¾ãã¦ã¯ã¢ãã«ãè¦ç´ãã¹ããªã®ã§ã¯ã¨ããæ°ããå ±åæ£æ§é åæã¨ããåå¼·ããã¨è ã«è½ã¡ãã®ã§ãããããè¬
ãã®å³ã® >85 years woman ã¨ããç´ ç´ã«è§£ã㨠A=1.28 C=-0.64 E=0.36 ã¨ãªãã®ã§ãããâ¦â¦

3ã¤ã®å¤ã®è§£é
ãã®3ã¤ãéºä¼çã¨å ±æç°å¢ã¨éå ±æç°å¢ãèªæã¨å®æ ãå²ã¨éãã®ã§æ³¨æãå¿ è¦ãã¨ãããã¨ã¯ãèªãã ãã®å ¨ã¦ã§è¨åããã¦ãã¾ãã
ã¾ãéºä¼ç vs ç°å¢ã§ãããä¾ãã°èº«é·ã®éºä¼ç 90% ã¨ããã¨ãã親ãé«èº«é·ãªã 90% ã®ç¢ºçã§åãé«èº«é·ãã®ããã«æãã¾ãããå®ç¾©ãããæãããªããã«ããããããæ±ããã§ããæ°åã§ã¯ãªãã§ããããã¾ã§ã人ã®å人差ãçµ±è¨çã«ã¯åæ£ãä½ãè¦å ã®ãã¡éºä¼åèµ·å ã®å²åãã¨ããããªãã ãããããããªãæ°åã§ãããã®æ°åãè¨ãããããã¨ãã£ã¦å³åº§ã«çµè«ãå°ããã¨ã¯é£ããããã®å¾ã®èå¯ãå¿ è¦ãªæ°åã¨çè§£ãã¦ãã¾ã
ã¾ããèªæã«åãã¦ãéºä¼çã¯çç©å¦çãªæ°åã¨ããããã¯ã社ä¼å¦çãªæ°åã¨èããæ¹ãè¯ãããã§ã人é¡å ¨ä½ã人種ã«å¯¾ãã¦ä¸å¤ãªãã®ã§ã¯ãªãã社ä¼ç°å¢ã«ä¾åãã¾ããä¾ãã°èº«é·ã®éºä¼çã¯æ°åå¹´ã®ã¹ãã³ã§å¢å ãã¦ããããã§ãããã¡ããéºä¼åãå¼·åã«ãªã£ã¦ãã®å½±é¿åãã¬ã³ã¬ã³å¢ãã¦ãããã¨ããããã¯ãªãã社ä¼ãè±ãã«ãªãååãªæ é¤ãåããªãäººãæ¸ããç°å¢ãããã£ãããç¸å¯¾çã«éºä¼çãé«ããªã£ã¦ãããã¨ãã話ã§ã

å ±æç°å¢ã¨éå ±æç°å¢ã®åé¢ã注æãå¿ è¦ã§ããå ±æç°å¢ã¯ãç´æçãªèª¬æã¯ãå®¶åºç°å¢ãã§ããã親ãååã®åä¾ã«å¯¾ãã¦éãæ±ãããã¦ããããéå ±æç°å¢ã®æ¹ã«ã«ã¦ã³ããããã®ã注æãå¿ è¦ãªã¨ããã§ã
è¡åéºä¼å¦3ã¤ã®æ³å
以ä¸ãè¸ã¾ãã¦ãè²ããªèª¿æ»ããã¦ããããããªç¹æ§ã«å¯¾ãã¦ã3ã¤ã®å¤ãæ±ãã¦ããã¾ããç¹æ§ã¨ããã®ã¯ã身é·ã IQ ãçµ±å失調çã妿 ¡ã§ã®æç¸¾ã社ä¼çãªæåã宿æ§ãç¯ç½ªæ§åããªã©ãªã©ãå¤å²ã«æ¸¡ãã¾ã
è²ã ã¨ãã£ãçµæã3ã¤ã®æ³åã«åæãåãã¦ããããã§ãããã£ãç´¹ä»ããååæ³ã¯è¡åéºä¼å¦ã®æ¹æ³ã§æãå¼·åãªãã®ã§ãããä¾ãã°é¤åã使ãã¨å ±æç°å¢ã®å½±é¿ã®æ¨å®ãã§ããããªã©ãä»ã®æ¹æ³ã§ã consistent ã«ç¢ºèªããã¦ããæ³åã§ãããã¨ã®ãã¨ã§ããããã
1. 人éã«ã¯è¡åç¹æ§ã«ã¯éºä¼ã®å½±é¿ããã
2. å
±æç°å¢ã®å½±é¿ã¯å°ãã
3. éå
±æç°å¢ã®å½±é¿ã¯å¤§ãã
1 ã¯ã人éã¯ç°å¢ã«ãã£ã¦ãªã«ãã®ã«ããªããã主義è ã§ãªããã°ãã¾ãåããããããã®ããªã¨æãã¾ããã¾ãåã¯ãã¶ãã¢ã¡ãªã«å¤§çµ±é ã«ã¯ãªããªãã 3 ã常èçãªè©±ã§ãéºä¼ã¨ç°å¢ãã©ã¡ããã ãããã¨ãã話ã§ã
2 ã«ã¤ãã¦ã IQ ãåç¤¾ä¼æ§ã宿æ§ãªã©ã®ãä¸é¨ã®ç¹æ§ãé¤ãã°ãããããå ±æç°å¢ã®å½±é¿ã®å½±é¿ã¯ã¼ããé常ã«å°ãªããã¨ããçµæãåºããã¨ãå¤ãããã§ããããã¯å ±æç°å¢ãå®¶åºç°å¢ã¨èããã¨ãããªãç´æã«åãã話ã ã¨æãã¾ããããã®è§£éã¨ãã¦ã¯ãåã«ãå®¶æã®åã¸ã®å½±é¿ã¯å°ãããã¨èãããã¨ãã§ãã¾ããããå®¶æã®å½±é¿ã¯åã«ãã£ã¦éãåãããããããã¨èãããã¨ãã§ãã¾ã
Coursera ã§ã¯ãä¾ãã°é¢å©ã¯ãåã®åæ§ãæ§å¥ãå¹´é½¢ã«å¿ãã¦ãéã£ãå½¢ã§å½±é¿ãä¸ããã®ãããããªããããã ã¨ããã¨ããã®å½±é¿ã¯éå ±æç°å¢ã«åé¡ãããããªã©ã¨è¿°ã¹ããã¦ãã¾ããè¡åéºä¼å¦ã®è¡ãªã£ã¦ããå®é¨ã§ã¯ããã®åå¥ã«é¢ãã¦çµè«ã¯åºããªãã¨æã£ã¦ãã¾ããã®ã§ãããããã¯ç§å¦çæ¹æ³ãé¢ãã¦ãå人ã好ããªè§£éãèããã°è¯ãé åã ã¨æãã¾ããå人çã«ã¯ããå®¶æã®å½±é¿ãå ¨ããªãã¨ããã®ã¯ãããã«ä¸èªç¶ã§ãããªã¥ã¼ã ã¾ã¼ã³ã®å®¶åºã¯ãã¶ãä¼¼éã£ã¦ãã¦å¤§ããªåæ£ãå½¢æããªãã¨ããç¹ã¨ãææããã¦ããåãéã£ãåå¿ãããã¨ããçç±ã®2ç¹ã§ãå°ããæ°åãåºãã®ã§ã¯ããããã«æã£ã¦ãã¾ã

éºä¼åã¨ç°å¢ã®ç¸äºä½ç¨
éºä¼åã¨ç°å¢ã¯ç¸äºä½ç¨ãããã¨ãç¥ããã¦ãã¾ããä¾ãã°ã社ä¼ççµæ¸çã«æå©ãªå®¶åºã¨ã社ä¼ççµæ¸çã«ä¸å©ãªå®¶åºã使®µéãã«åé¡ããä¸ã§ã IQ ã®éºä¼çã調ã¹ããã¿ãããªç ç©¶ãããã¾ããããã§ããã£ããã¨ã¯ãã社ä¼ççµæ¸çã«æå©ãªå®¶åºã§ã¯ãéºä¼çãé«ããªããã¨ãããã¨ã ããã§ã

ããã¯é«ãè½åãæã¡ããéºä¼åã¯ãè¯ãç°å¢ã§ããçºæ®ãããã¡ã§ã社ä¼ççµæ¸çã«ä¸å©ãªå®¶åºã§ã¯ãé«ãè½åãæã¡ããéºä¼åãã ãã«ãªããã¨ããããã¨ãããã¨ãããã¨ããã¨ããä¸ã¤ãé ãæªãéºä¼åæã£ã¦ãã¨è¯ãç°å¢ã§ãé è¯ããªãã«ããã¨ãããã¨ã§â¦â¦ããã¯ãªããªã discouraging ãªçµæã§ã¯ããã¾ãã叿ãæã¦ãè§£éã®ãããã¨ãã¦ã¯ããèªåã徿ãªãã¨ãè¦æ¥µãã¦ããã«åãçµãã°ãæè½ãçºæ®ã§ããå¯è½æ§ãé«ããã¨ãè¨ããããã¨ããã®ãããããªãã¨æãã¾ã
ä¸è¬çã«æªãã¨ããã¦ããç¹æ§ã«ã¤ãã¦ããéºä¼åã¨ç°å¢ã®ç¸äºä½ç¨ãããã¾ããä¾ãã° MAOA ã¨ããéºä¼åãæ¬ æãã¦ããã¨ãç¯ç½ªãç¯ãçãææã«é«ããªãããã§ããã幼尿ã«èå¾ ãåãã¦ããªã群ã§ã¯ç¹ã«ç¯ç½ªæ§åãå¢ããªããã¨ãããããªãã¨ããããããã§ã
ãã®ç¸äºä½ç¨ã®ãã¸ãã£ããªä½¿ãããã¨ãã¦ãç¹å®ã®ç æ°ã«ãªããããéºä¼åãæã£ã¦ããã¨ãããã°ããã®å¯¾çããã¦ããã¨ãããã¨ãããã¾ããè¡åéºä¼å¦ã®æ¬ãªã©ã«ããåºã¦ããä¾ã¨ãã¦ããã§ãã«ã±ãã³å°¿çã¨ããç æ°ãããããã®åå éºä¼åãæã£ã¦ã人ã¯ãã»ã£ã¦ããã¨è³é害ãçºçãã¾ãã¾ããã§ããããã§ãã«ã¢ã©ãã³ã®æåãé£äºå¶éã§ã³ã³ããã¼ã«ãããã¨ã«ãã£ã¦ãçºçãæ¢ããããããªãã¦ã®ãããã¾ãããããã話ãèãã¨èªåãå ¨ã²ãã è§£æãã£ã¦ã¿ãããªãã¾ã
ã¨ããã§ãç¸äºä½ç¨ã®è©±ãèããã¨ã Falconer model ã¨ããã®ã¯é©åãªã®ã ãããâ¦â¦ã¨ããæ°æã¡ã«ãªãã¾ãã Falconer model ã®ããã«éºä¼çã¨ç°å¢ãè¶³ãç®ã§èããã®ã¯è¼»è¼³èª¬ã¨è¨ããããã°ãã°ç¸äºä½ç¨èª¬ã«æ»æããããã輻輳説ã§è¯ãã®ã§ãããçãªãã¨ãæ¬ã«ã¯æ¸ãã¦ããã¾ããåã ã®äººéã§è¶³ãç®ã¯ä¸é©åã ãã©ãéå£ã®åæ£ãèããå ´å㯠OK ãã¨ãã話ã ã¨çè§£ãã¦ããã®ã§ããâ¦â¦ãã®ãããã¯çµ±è¨ç¥èä¸è¶³ã®ãããããã¾ãè ã«è½ã¡ã¦ããªãã§ã
è¡åéºä¼å¦4ã¤ãã®æ³å
Coursera ã§ã¯ããä¸è¬çãª3ã¤ã®æ³åã«å ãã¦ãç§ã¨ãã¦ã¯ããä¸ã¤è¿½å ããããã¨ãããã¨ã§ã4ã¤ãã®æ³åãææ¡ããã¦ãã¾ããã "Human behavioral traits are polygenic." ã¤ã¾ãã人éã®è¡åç¹æ§ã¯è¤æ°ã®éºä¼åã«ä¾åãããã¨ãããã®ã§ã
ããã¯ã¾ãæ®éã«èãã¦ããã§ããããè¡åç¹æ§ã¨ããã®ã¯æ®éãè¤éãªãã®ãªã®ã§ããã®éºä¼åãããã¨é« IQ ãã¨ãããã®éºä¼åãããã¨çµ±å失調çã«ãªããã¨ããããããåç´ãªãã®ã§ã¯ãªããã¨ãéã«åç´ã«ä¸ç®æã§åå ãç¹å®ã§ããéºä¼åããããå°ãåã§ããããã§ãã«ã±ãã³å°¿çãªããã¯ãéºä¼åãä¸ç®æè¦ãã°ããããã®ãããã§ããã¡ã³ãã«ãè±ã®è²ã¨ãã§ç ç©¶ãã¦ããã®ã¯ããã®æã® polygenic ã§ãªãéºä¼åã§ããããã¾ããããããã®ã¯ä¾å¤ã§ãã»ã¨ãã©ã®è¡åç¹æ§ã¯ãè¤æ°ã®ãé常ã«å¤ãã®éºä¼åã«ä¾åãã¦ãããã¨ãã話ã§ã
ä¾ãã°çµ±å失調çã§ã¯ã 1990 年代ãã15å¹´ããã¦è¡ãªããããå¤§è¦æ¨¡å®é¨ãããã¾ãããã㯠2000 人ã®çµ±åå¤±èª¿çæ£è ã¨ã 2000 人ã®å¯¾ç §ç¾¤ã«å¯¾ãã¦ã 648 ç®æã®éºä¼åã調ã¹ããã¨ãããã®ã§ãããã®å®é¨ã§ã¯ 15 å¹´ãããã°ã£ã¦ãã£ãã«ãé¢ããããããã®ä¸ã«ææã«çµ±å失調çã¨é¢ä¿ãããã¨è¨ãããã®ã¯ãªããã¨ããæ²ããçµè«ã¨ãªã£ã¦çµããã¾ãã
ãã®ãããªçµæã«ãªã£ãçç±ã¨ãã¦èãããã¦ãããã®ã¯ããçµ±å失調çã®å¼·ãåå éºä¼åãªãã¦ãã®ã¯ãªããé常ã«ãããããå°ãªãã¨ã1000ãè¶ããåå éºä¼åãããããããä¸ã¤ä¸ã¤ã®å½±é¿ã¯é常ã«å°ããã®ã§ã 2000 人ãããã®ãµã³ãã«ã§ã¯ææãªãã¨ã¯è¨ããªããã¨ãããã®ã§ã
ãã®å¾ãã²ãã è§£æã¯ãããå¢ãã§é²åãã¦ãããã²ãã ã®ã»ã¼å ¨åãã«ãã¼ã§ãã GWAS ã¨ããææ³ã確ç«ããã¾ããµã³ãã«æ°ãæ£è 2ä¸ä»¥ä¸ãå¯¾ç §ç¾¤4ä¸è¿ããã¨ããè¦æ¨¡ã«å¢ããã¦å§ãã¦ã 22 ã®éºä¼åãææã§ãããã¨ããçµè«ã 2013 å¹´ã«åºããã¨ããæããããã§ã

ãã®ã°ã©ãã¯ãã³ããã¿ã³ããããã¨è¨ããããã®ã§ãããæ¨ªè»¸ã¯éºä¼åã®å ´æã§ã縦軸ã¯ã縦軸㯠P å¤ã«å¯¾ã㦠log_10(p) ã§ãã 7 ãããã®ã¨ããã«èµ¤ã横ç·ãããã¾ããã 10M ãããã®ç®æã調ã¹ã¦ããã®ã§ã P å¤ã 10^-7 ããå°ãããªããªãã¨ãçµ±è¨çã«ææã§ãããã¨ã¯ãããªãæãã§ããã¤ã¾ããã®èµ¤ãç·ãè¶ããã¨ããã«ããããã¤ãã®ç¹ããææã«çµ±å失調çã¸ã®å½±é¿ããããããã¨ããã 22 ã®éºä¼åãããã§ã (ãªãã20åã赤ç·è¶ãã¦ãç¹ç¡ãããã«è¦ããæ°ããããã©)
ææ³
ãã®æã®è©±é¡ãå人ã®ä¿¡æ¡ã®åé¡ã ã¨æã£ã¦ãã®ã§ããããããã¨ãçµ±è¨çã«åæãããã¨ãããã¨èªä½ã楽ããæãã¾ãããããããç´æçã«çã¨æãããããªãã¨ãè£æã¡ãããããªå½¢ã§ãå²ã¨ããããªãã¨ãããã£ã¦ããã®ã ãªããã¨
æè¿ã¯éºä¼å¦å´ã®é²åã«ããã社ä¼å¦çãªé°å²æ°ããçç©å¦çãªå´é¢ã大ãããªã£ã¦ãã®ãé¢ç½ãã¤ã³ãã«æãã¾ãããç¹ã«éºä¼åæ å ±ã®å»çå©ç¨ãªã©ã夢ããã£ã¦è¯ããªã¨
ãã¨ããã®ãããã®è©±ã¯ãç°¡åã«ç§å¦çãªç¥è¦ãã¤ããªãã®ã¼ã«æªããããããã¨ããã®ãé¢ç½ãã¨ããã ãªãã¨ãããã¯è²ããªç§å¦åéã§ããããã§ããããã©â¦â¦ããããã°ãè¡åéºä¼å¦ã¨ä¼¼ããããªèå³ããã ç¯ç½ªå¦ã¨ããæ¬ãèªãã§ãããã¨ããã£ãã®ã§ãããå¤ãæä»£ã ã¨ãç¯ç½ªããããã¤ã¯è³ãå°ãããã¿ãããªç説ãè²ã åºã¦ãã¦æ¥½ããã£ãã§ããã¡ãªã¿ã«ãã®èª¬ãææ¡ããå¦è ã¯è³ãå°ããã£ããã¨ãããªãã¤ãã§ã
éçºã¤ãã¬ã¼ã·ã§ã³åé
éçºã¤ãã¬ã¼ã·ã§ã³ãæ©ãããã°ãããªãã®åé¡ãåæã«è§£æ±ºããããã¨ä¿¡ãã¦ãã¾ãããªããæè¿ãä»ã®è¦ç´ ã軽è¦ãããã¦ããããç¹ã«ã¤ãã¬ã¼ã·ã§ã³é度ã«å½±é¿ããªããããªãã¨ãããã¦ããæ°ããã¦ãã¦ãä¿¡ä»°ã¨ãã®ã¬ãã«ãããããªããã¨ããæ°ããã¦ããã®ã§ãã¡ãã£ã¨æ¸ãã¦ã¿ããããªã¨ã主㫠C++ ã®è©±ã§ãã
ä»äºã¨ããã¦ãã¨è¯ã夿åãæ±ããããããã¾ããã夿ã¨ããã®ã¯çµæ§é£ããã§ããããã¢ããã¼ã A 㨠B ã§æ©ãã æã«ãæãéããã°ä¸¡æ¹ã§ããããã¾ããéçºã¤ãã¬ã¼ã·ã§ã³ãç¡éã«éãããã¨ãå¿ è¦ã¨ããã夿åã¯ã¼ãã«æ¼¸è¿ãã¦ããã¾ãããã£ããã
2æã§å¤æ´ã®æ£å½æ§ãé«éã«ç¢ºèªã§ããããã«ãã
make (ããã®ä»ã®ãã«ãã³ãã³ã)ã¦ãã£ãããã«ããã§ãã¦ã make check (ããã®ä»ã®ãã¹ãã¹ã¯ãªãã)ã¦ãã£ããé ããªããã¹ããå ¨é¨èµ°ããã¨ããä½å¢ã好ãã§ãã試ãããã«ã¯ãã£ã¡ã®ãã£ã¬ã¯ããªã§ make ãã¦ãã£ã¡ã§ build.sh ãèµ°ããã¦ãããã§ bin/test foobar ã¨ãããã¨ã§ããâ¦â¦ã¿ãããªã®ã¯ã¨ã¦ãè¯ããªããåç´ã«æ°ãããã¼ã ã«å ¥ã人ã¨ãã«ã¨ã£ã¦ãå³ããã§ãããâ¦â¦
ãã®ããã«ã¯(æ£ç´ã©ããã¨æããã©)ãã¹ãã®ç¶²ç¾ æ§ãæ¨ã¦ã¦è¯ãã¨ããèãã¦ã¾ããã¾ãçæ³çã«ã¯ CI ã§ã¯ç¶²ç¾ çãªãã¹ããèµ°ããã©ãæå ã§ã¤ãã¬ã¼ã·ã§ã³åãæã®ãã¹ãã¯ãã®ãµãã»ãããã¿ãããªã®ãè¯ãã®ã§ãããã CI ã¨ããã° CI ã®æéã¡ãã£ã¨åãã¨ãã好ãã§ã好ããªãã ãã©ãã®æéãã¶ãæ¬æ¥ã®ä½æ¥ã«åããæ¹ãè¯ãã±ã¼ã¹ãå¤ãã¨æãã®ã§ãä¿¡ä»°ã ãªãã¨æããããã§ãããã¾ãã
ã¤ãã¬ã¼ã·ã§ã³ãé«éåãããããªãã©ããªåªåã§ãããã®ã§ãã¡ããã¨è¤æ°ããã»ããµä½¿ã£ã¦ä¸¦åã«ãã¹ããèµ°ãä»çµã¿ãæ´ãããããã¾ãã
ç´°ããã¦ããããã¹ããé¿ãã
ã¦ããããã¹ããã¡ããã¨æ¸ãã¦ãã¦ãããªããçµå±ããã使ã£ã¦ãã main ã®é¨åã¨ãã Python ã¤ã³ã¿ã¼ãã§ã¤ã¹çããã¦ããããã®æ¥ç¶é¨åã«ãã°ãåºããããã®ã§ããªããçµå± end-to-end ã§èµ·ããæåã§ãã¹ãããã®ãä¸çªç¢ºå®ã ã¨æã£ã¦ãã¾ãã Ruby ãªããã¯ã»ã¨ãã© (å ¨é¨ã ã£ãï¼) ã®ãã¹ãã Ruby ã§æ¸ããã¦ãã¨æããã§ããããããªæ°æã¡ã§ãã
ãªããªãããããã©ããã¨ã¯æãã®ã§ãããç´°ããããã¦ããããã¹ããæ¸ããªãããã«ãã¦ãã¾ããç´°ãããã¹ãæ¸ãã¦ãã¨ã³ã±ãæã«ãã®å ´æã®ç¹å®ãã©ã¯ã«ãªããªã©ã®ã¡ãªãããããã®ã§ããããã¹ããã³ã±ã確çã£ã¦ãããªã«é«ããªãã¦ãã³ã±ãæã«ãããæéã®ç¯ç´ã«å¯¾ãã¦ãã¡ããã¨ã¦ããããã¹ããæ¸ãã³ã¹ãã®æ¹ãé«ãã¨ãããã¨ã¯çµæ§ããããã«æãã Ruby ã®ä¾ã®ããã«ã end-to-end ã®ãã¹ãã®æ¹ããç´°ããã¦ããããã¹ããæ¸ãããæ¥½ãªã±ã¼ã¹ã¯ç¹ã«ã AST ãèªåã§æ§ç¯ããããããã¹ãããã AST ã«ãªã£ã¦ãããã§ãããã³ã¼ããæ¸ããæ¹ãã©ã¯ãã¨ãã話ã
ããããæå°åãã
ãã«ãæéãæå°åãããã¦ãããããµã¤ãºã£ã¦çµæ§å¹ãã¨ããä¿¡ä»°ãæã£ã¦ããã®ã§ããªãã¹ãããããå°ãããã¦ãã¾ããæã¯ãããæ¸ãã¨æä½1ã¤ã¯ã¯ã©ã¹ããã£ãã®ã ãã©ãæè¿ã¯é¢æ°2,3å宣è¨ããã¦ãã ããã¿ãããªãã¨ãå¤ãã
ä¿¡ä»°ãªã®ã§æ¬å½ã«å¹ãã¦ãã®ãã¯ãããã¾ããããããããªã³ãªã¼ã©ã¤ãã©ãªã¨ã使ã£ãæã«ããã®é¨åã ãæããã«ã³ã³ãã¤ã«ãé ãã£ããããã®ã§ãä¸ã®ä¸ã®äººãã£ã¨ããããã·ã³ãã«ã«ãã§ããã°ãããã§ template 使ããªãããªã©æ°ãã¤ãã¦ãããã¨ãªãâ¦â¦ã¨ããæã£ã¦ãã¾ãã
ãã¨ã¾ãããè¨ããããã¨ã§ãããéå°ãªæ½è±¡åã¨ãã§ããã YAGNI!
ããããã§ãã¯ãã
ã¤ãã¬ã¼ã·ã§ã³ãæéåãããã®ã§ãã£ã¦ãã¿ã¤ãã³ã°ãæéåãããã®ã§ã¯ãªãã®ã§ãå²ã¨ããã assertion ç¸å½ã®ã³ã¼ããå ¥ãã¾ããä¾ãã°
CHECK_LE(0, i); CHECK_GT(x_.size(), i); return x_[i];
ã®ãããªã³ã¼ããæ¸ãã¾ãã x_.at(i) ãããã°ãã§ãã¯ããä¸ã§å¤±æããã throw ãã¦ãããã®ã¯ãã¡ããç¥ã£ã¦ããã®ã§ãããä¾å¤ãèµ·ããæã«ãã©ãã§èµ·ããä¾å¤ããããã¯ãã¬ã¼ã¹ããç¹å®ãã¦ã gdb ã§ i ã®å¤ãã©ããªã£ã¦ããããªã©ãããã®ãçµæ§æéãªã®ã§ãå¼ã³åºãå ã®è¡æ°ã¨ãæ¯è¼ãã¦ããå¤ã表示ãã¦ããããä¸è¨ã®(glogç±æ¥ã®)ãã¯ãããæ°ã«å ¥ãã§ãã
ã¾ãã CHECK_EQ(x, y) << z ã¿ãããªãã¨ãã§ãã¦ã z 㯠x != y ã®æã ãè©ä¾¡ããã¦è¡¨ç¤ºãããã®ã§ããããã®æ operator<< ã x, y, z ã®å ¨ã¦ã«å®ç¾©ããã¦ããªãã¨ãããªãã®ã§ãããã©ããããã©ãç©æ¥µçã« stringify ããã³ã¼ããæ¸ãããã«ãã¦ãã¾ãã
æé©åãªãã·ã§ã³ã¤ãã§éçº
ããã¯ã±ã¼ã¹ãã¤ã±ã¼ã¹ã§ãç¹ã«åæã®é ã¯ããã -O ã¯ã¤ããã«ä½æ¥ãã¾ããããã¹ãæéãå¢ãã¦ããã¨ãåºæ¬çã«å¸¸ã«æé©åãªã³ã§ä½æ¥ãã¦ããã¾ã«èµ·ãã gdb ã§ã®ãããã°ä½æ¥ãã¤ãããªãã®ã¯ææ ¢ãããã¨ããã¹ã¿ã¤ã«ã«ãããã¨ãå¤ãã§ããä¸è¨ãã¯ãã§ããããã ãã«ãã§ãã¯ãå ¥ã£ã¦ããã¯ããªã®ã§ã gdb ãå¿ è¦ãªå¯è½æ§ãè½ã¨ãã¦ããâ¦â¦ã¯ãã§ãã
ãã¨ã大ããããã¸ã§ã¯ããªã -g ãåã£ã¦ãã¤ãã¬ã¼ã·ã§ã³ãæéåã㦠printf å ¥ãã¾ãã£ãæ¹ããããã°ãããããã¨ããæãããã¾ãã LLVM ã§éãã§ãæã¨ãã¯ãããçµå±ä¸çªè¯ãããã«æãã¾ããã
ãã¨ããªãªã¼ã¹ãã«ãã§æ¶ãã assertion ãã¨ããæ¦å¿µãå«ãã§ããã»ã¼ 99.9% ããã©ã¼ãã³ã¹ã«å½±é¿ããªãããã«ãå¯ä½ç¨ã®ããå¼ã®è¨è¿°ãé¢åã«ãªããããã解決ããã¨åç §ãããªã夿°ãã§ãããã¨ããã£ã¦å«ãã NDEBUG æã ãèµ·ããã³ã³ãã¤ã«ã¨ã©ã¼ã¨ãã§æéãæ¶è²»ãããããã®ãå«ãã
ãªãã¹ã auto ã使ããªã
auto ãæ¸ãã¦ãæã¯ã©ã¯ãªãã§ãããèªãã§ãæã«ãããã³ã¹ããå¢ããã®ã§ãæçåå²ç¹ã¯ 20 æåããããããªãã¨æã£ã¦ãã¾ãã iterator ãªããã¯ããã©ããããæèããèªæãªãã¨ãå¤ãã®ã§ã auto 使ããã¿ãããªæ°æã¡ã§ãã¾ãã
auto ã«éãããã«ã¼ãå å ã std::transform ãä¸é æ¼ç®ã¿ãããªãã¤ããæ¸ãã®ãã©ã¯ã«ãªããããã«ãåãªãç´æ´ãªã«ã¼ããåå²ã®æ¹ãå¯èªæ§ãé«ãã¨æãããã¨ãå¤ãã¦ãä»ã®äººãã使ãé »åº¦ãä½ããªããã¨ããæãã¾ãã
䏿¹ã§ using namespace ã¯ãã¾ãå®å®³ãç¡ãã¦ã³ã¹ãè¯ãã¨æã£ã¦ãã(ç¹ã« std ã¯ã¹ã¿ã¤ã«ãéãã®ã§ç¡ãã¦ãæç½)ã®ã§ãããã³ã¼ãã£ã³ã°è¦ç´ã§è¨±ããã¦ãªãã®ã§è«¦ãã¦ãã¾ãâ¦â¦
ã¾ã¨ã
ãªããä»ã«ãããæ°ãããã®ã§ãããä»ã¨è¦æ¯ã¹ã¦ã¦ãèªåã®ã¹ã¿ã¤ã«ãéãã¨æãããã¨ãå¤ãã¨ããã並ã¹ã¦ã¿ã¾ãããä»ã®äººã®å·¥å¤«ã¨ããæ°ã«ãªãã¨ããã§ãã
20%ã«ã¼ã«ã«ã¤ãã¦
20%ã«ã¼ã«ã¨ããä»çµã¿ã®éè«ã«ãªã£ã¦è²ã èãã¦ãããã¨ãæãåºãã¾ããã
åã¯ããã20%ã«ã¼ã«ããã¾ã好ããããªããã¾ããæéãç´°åãã«ãªã£ã¦å¹çãæªãåé¡ã¨ããã®ããããã20%ã«ã¼ã«ã®ãããã§ã¤ããã¼ãã£ããªãããã¯ããçã¾ãããã¨ããã®ã¯ãã¤ããã¼ãã£ããªã¢ã¤ãã¢ã«ãé¢ããã100%ã®æéãããã«è²»ãããã¨ãã§ããªãã£ããã¨ãããã¨ãªããããªãããã¨æã£ã¦ãã¾ãã1ã¶æã§å®ç¾ã§ããã¯ãã®ã¢ã¤ãã¢ã«ãåç´è¨ç®ã§5ã¶æãããããã§
ããã§ãåã®å¥½ããããªãã¹ã¿ã¤ã«ã®20%ã«ã¼ã«ã¯ãéææ¥ã¯20%ãä»ã¯ã¡ã¤ã³ã®ããã¸ã§ã¯ããã¨ããã¹ã¿ã¤ã«ã®ãã¤ã«éå®ãã¦ãã
好ããªã¹ã¿ã¤ã«ã¨ãã¦ã http://shinh.hatenablog.com/entry/2016/03/11/142748 ã«æ¸ãããåå¹´ã¡ã¤ã³ããã¸ã§ã¯ãã«éä¸ãã¦ãåã§ããããªãããã£ã¦ã¿ãããã¨ãã§ãã¾ããã1ã¶ææéããã«éä¸ããæéãä¸ããããã¾ããããªãã£ããæ¨ã¦ã¾ããã¦ãã¤ãéä¸ã§ããã®ãè¯ããã1é±éã«1æ¥ã¹ã¿ã¤ã«ããã失æããæã«æ¨ã¦ãããã¨ããã®ãè¯ãããã«æã
æ¬¡ã«æåã®ãã¤ããå«ããªãã¤ã¨ãã¦ãèªå磨ãããããä¼ç¤¾ã«é¢ä¿ãªããã¨ã«20%ã使ããã¤ãããã¯ãªãããåããè¦ãã¨ãã¹ãã©ãã¥ã¼ã³ãã£ã¦ãã®ã¨åºå¥ãå ¨ãç¡ãã使ããªãã¨æãªå¢ãã«ãªã£ã¦ãä¸å ¬å¹³æããã§ãããªãããã«æãããããèªããã®ã§ããã°ãåç´ã«ãç¦å©åçã¨ãã¦é±ä¼3æ¥ãã¨ããè¦æãã»ãã
ããä¸å好ããªã¹ã¿ã¤ã«ã¨ãã¦ãè¨ã訳ã¨ãã¦ã®20%ã¨ãããã5%ã«ã¼ã«ã¨ã§ãããããä»ç´è¿ã®ä»äºã§ã¯å¿ è¦ãªããã©ãé·æçã«è¦ããå½¹ã«ç«ã¡ãããªç¥èãä»å ¥ããã¨ãã便å©ã¹ã¯ãªãããæ´åããã¨ãã zshrc ãå å®ãããã¨ãããªãããããããå ¨ç¶ã¤ããã¼ãã£ããããªããã¤ãä¼ç¤¾ã§ãããããã¾ããããã¿ãããªã¿ã¹ã¯ãããæã«ããããããã¨ãçªç¶ãããããªãæããã£ã¦ããããããã¨ã«æéã使ãã®ã¯ã¡ãã£ã¨æ°ãã²ããã®ã ãã©ããã¾ã20%ã¦ãã¨ã§ãã¿ããã«é©å½ã«è¨ã訳ã§ããã®ã¯è¯ã
ããã¾ã§ã¯åè·ã®è©±
ä»ã ã¨ãã¨ã³ã¸ãã¢ã10000人ã¨ãããªãã®ã§ãå¿ ç¶ã¨ãã¦ãä¸äººããããé¢ããããã¸ã§ã¯ãã®æ°ãå¢ããããããªãã¨ãããã®ããã¸ã§ã¯ãã¯éè¦ã ãã1人ã¢ãã±ã¼ã·ã§ã³ããã®ã§ããå¤ããã¿ãããªããã¸ã§ã¯ããåºã¦ãããã ãªããã¨ãããã¨ã«æ°ä»ãããããªã£ã¦ããã¨ã0.2人ãã¢ãµã¤ã³ã§ãããéææ¥ã¯20%ã«ã¼ã«ãã¨ãããæåã«å¦å®ããã¹ã¿ã¤ã«ã®20%ããã¢ãªãããããªããªãâ¦â¦ã¨ãæãã¦ããããã ãéææ¥ã¯ââãã¨ããã¹ã¿ã¤ã«ã¯åã«ã¯å¹çãæªãããã«æãã®ã§ã1é±éãã¨ã«ã©ã£ã¡ãã«åããã¿ãããªã®ã試ãã¦ã¿ããã¨ã«ãã¦ã¿ã¾ããã
20%ã®ãã¨ã ãã§ãããã ãã©ãåè·ã§æ£ããã¨ããã¦ãããã¨ããå½ããåã®ãã¨ãªãã ãããã©ãéãè¦æ¨¡éãæåã®ä¼ç¤¾ã§é©ç¨ãã¦ãã¾ãããã¨ã¯éããããã¡ããéããããªãã¨æãã¾ããè²ããªãã¨ã«ã¤ãã¦ãéãã«æãã馳ããªãããã±ã¼ã¹ãã¤ã±ã¼ã¹ãªæãã§æé©ãªããããã¯ã©ããªãã ãããªãâ¦â¦ã¨ãèããã®ã¯çµæ§é¢ç½ããªãã¨æãã¾ãã
転è·ãã¦ãããã£ã¦ããã¨
転è·ãã¦ãããã£ã¦ãããã¸ã§ã¯ãã«ã¤ãã¦ä½ãæ¸ãã¦ã¿ãããã¨æãã¾ãã
https://github.com/pfnet-research/chainer-compiler/
å ¬å¼ã½ãããã°ãæ¸ãã¾ããã
ãã¾ã綺éºã«ã¾ã¨ã¾ã£ãæç« ãæ¸ããæ°ãããªãã®ã§ãã¤ãã¤ãã¨æç³»åã§æãåºãã¦è¡ãããã¨æãã¾ãã
転è·åã define-by-run ã¨ãã«ã¤ãã¦èãã¦ãããã¨
ã¾ã åè·ã«ããæãè»¢è·æ´»åä¸ã«ã ChainerX ã®åå¨ãã Python ããã³ã³ãã¤ã«ãã¦å®è¡ã§ããã¨è¯ããªã¨æã£ã¦ãããã¿ãããªè©±ãèãããããªæ°ããã¾ããããã¯çµæ§ãå ·ä½çãã¤ç¡è¶ã¶ãæããã話ã§ãã¾ã楽ãããã ãªã¨æã£ãã転è·å ãæ±ºããçç±ã«ãªã£ããããªæ°ããã¾ãã
æ©æ¢°å¦ç¿ãã©ããªè¨ç®ãã¦ããã¨ããã¨ããããè¡åã®ããç®ã°ãããã¦ãããã¨ããã説æãã¾ããã¨ã¯ããéç·åãªè¦ç´ ãå¿ é ã ããè¨ç®çµæãã©ãã¤ãªãããã¿ãããªã®ã§ãªãããã¾ãããæ¹æ³ãçºè¦ããããããããã¯ã®æ¥ç¶ãããããåãã¦ããããªæè¦ãããã¨æãã¾ãã
ã§ãããããæ¥ç¶ããã«ããã«ãããæ©æ¢°å¦ç¿ãã¬ã¼ã ã¯ã¼ã¯ãè²ã ããããã§ããã Chainer 以åã¯ããããã¯ã®æ¥ç¶ãä½ã DSL ããã£ã¦ãæ¥ç¶ãã§ãããã誤差é伿ã®è¨ç®ãèãã¦ããã¤å®è¡ãã¨å®è¡ããå½¢å¼ã ã£ãã¨ã tf.add(A, B) ã¨ãããã¨ã A + B ãå®è¡ããããããªãã¦ãè¶³ãç®ããããã®è¨ç®ã°ã©ãå ã®ãã¼ããè¿ããã¿ãããªæã
ã§ Chainer ã¯ã chainer.functions.add(A, B) ã¨ãããã¨ããã®ã¿ã¤ãã³ã°ã§å®éã«å®è¡ãããå®è¡ããã¨åæã«ã誤差é伿ããæã«å¿ è¦ãªã°ã©ããä½ã£ã¦ãããã³ã³ãã¤ã©ã«å¯¾ããã¤ã³ã¿ããªã¿ã¨ããè¶£ãã§ãåé¡ãèµ·ããæã«åé¡ã®ããè¡ã§æ¢ã¾ãã®ã§ããããã°ããããããåå²ãªã©ãå«ããããªãã¬ãã·ãã«ãªã¢ãã«ãæ®éã«è¨è¿°ã§ããããªã©ã®ã¡ãªãããããã¾ãããã ãæ¬ ç¹ã2ã¤ããã¾ã
- Python ç¡ãã®ãããã¤ãã§ããªããè¨ç®ã°ã©ããä½ã DSL ã¨ããå½¢å¼ã§ããã°ããã®ã°ã©ããã¨ã¯ã¹ãã¼ããã¦ãã¾ãã° Python ç¡ãã®ã¢ããªãã使ããããã§ãã
- é度çã«ãªã¼ããããããããããã¯ã CUDA ã®é¢æ°å®è¡ãé å»¶ããã¦ãããããã§ãåç´ãªã¢ãã«ã§ã¯ GPU å¾éã«ãªã£ã¦ Python+CPU ã§ã°ã©ãä½ã£ãããã¦ãã³ã¹ãã¯é ãããã¨ãå¤ãã§ãã cupy ã¦ã»ã³ã¹ãããã®ã ãªãã¨ã¤ãã¥ãæãã¾ããããèªç¶è¨èªã¢ãã«ããå°ããã¢ãã«ã 㨠CPU å¾éã«ãªã£ãããããã GPU ãé«éåãç¶ãã¦ããã¨ãç¸å¯¾çã«åé¡ã大ãããã¦ãã£ã¦ãã¾ãã
ã§ãããã¾ããç ç©¶è ã®ã¤ãã¬ã¼ã·ã§ã³éåº¦ã®æ¹ãéè¦ã ã¨èãã¦ãã¦ã define-by-run è¯ããªãã¨æã£ã¦ãã¾ãããã«ã¼ããããã¢ãã«ãæ±ã£ã¦ããã¨ã«ãããã¤ã¢ã¹ãããã¨æãã¾ããã
ãããªæã«ãªãã»ã©ï¼ã¨æããã®ãç¾ããã¾ããã Swift for TensorFlow ã¨ãããã¤ã§ãã Swift for TensorFlow ã¯ã define-by-run ãã¤ã¾ãã¢ãã«å®ç¾©ãå®è¡æã«è¡ãªããã¨ãéè¦ãªã®ã§ã¯ãªããã¢ãã«ããã¼ã¿ã§ãªããã³ã¼ãã§å®ç¾©ããã¦ãããã¨ãéè¦ãªã®ã ãã¨ä¸»å¼µãã¾ããã彿ã tf.while_loop ãããªã㦠Python ã®æ®éã®ã«ã¼ãã使ããã¦ãããã¨æã£ã¦ããã®ã§ããã®ã³ã³ã»ããã大夿°ã«ããã¾ããããã®å³ããªãã»ã©ã¼ã¨ããæãã§ããã
ã°ã¼ã°ã«ã®ä½ã£ããã®ã§ Native Client ã®æ¬¡ãããã«å¥½ããªãã®ã¨ãããã¨æãã¾ããã¤ã¾ãæåããæ°ãããªãã®ã§ããã Swift æ¬å½ã«ä½¿ãããã«ãªãã®ãï¼ï¼ã¨ããæ®éã®çåãã¾ãããããã§ãã
ã§ãããããã¿ã¤ãã³ã°ã§ãè»¢è·æ´»åä¸ã«ãå ·ä½çã«ã©ãããè¨ç»ãããããããªããã©ã Python ã³ã³ãã¤ã«ããããã¨ãã話ã ã£ãã®ã§ãæ¬å½ã«ã§ããã®ãã¯ããããããªããã©ãããã¯é¢ããããã®ãªãææ¦ãã¦ã¿ãã話ã ãªãã¨æãã¾ããã
ãã®ã¸ãã® DL ãã¬ã¼ã ã¯ã¼ã¯è©±ã¯ éè·ç´å¾ãå ¥ç¤¾åã®éã®ææã«ãæ¸ããããã¾ããã
å ¥ç¤¾ãã¦ã¿ã
å ¥ã£ã¦ã¿ãã¨ãä½ã決ã¾ã£ã¦ãªãããããªãã IR ããã¶ã¤ã³ãã¦ã Python ãããã«å¤æãã¦ã ChainerX ã§å®è¡ããã®ãã£ã¦ãããã¨ããè¶£æ¨ã®ãã¨ãè¨ãããã¨æãã¾ããããã¡ãã£ã¨å ·ä½çã«è¨ç»ãå®è£ ãæ¢ã«ãããã¨æã£ã¦ãã®ã§ãããã¶ãç¡è¶æ¯ãæ¥ããªããã¨æã£ãããã«æãã¾ãã忥ã«ã¤ã³ã¿ã¼ã³ã®äººãå ¥ã£ã¦ãã¦ããã®äººã«ã¯ Python ã ONNX ã¨ããæ¥çæ¨æºã®ã¢ãã«ã·ãªã¢ã©ã¤ã¼ã¼ã·ã§ã³ãã©ã¼ãããã«å¤æããã¿ã¹ã¯ããã£ã¦ããããã¨æã£ã¦ãããã¨ãã話ãèãã¾ããã
ããä¼¼ããã㪠Python ãã夿ããã¿ã¹ã¯ãå¥ã ã«ãã£ã¦ã©ããããããã¨ãããã¨ã§ã ONNX ããã£ã¨çºããã¨ããããããæ¡å¼µãããååã«ãã£ã¦ãããã ãããã¨æããã®ã§ãã¤ã³ã¿ã¼ã³ã®äººã«ã¯ Python => ONNX ã®é¨åãç§ã®æ¹ã¯ ONNX ãå®è¡ãããã®ã ChainerX ã使ã£ã¦ä½ãé¨åãã¨åæ ãããã¨èãã¾ãããããã¯ãªããªãè¯ã決æã ã£ãããããªãããªã¨æã£ã¦ãã¾ããå®ã®ã¨ãããã¶ã¤ã³ã¨ãå ¨ãèªä¿¡ãç¡ãã®ã§ã IR ã¨ããã¾ãä½ããæ°ãããªãã£ãããããç¨åº¦èãããããã¶ã¤ã³ã«ã¿ã¿ä¹ãã§ããã®ã¯ããããã£ãããã¨ã ONNX ã®ã¨ã³ã·ã¹ãã ã¾ããã®ä»ã®äººãã¡ãä½ã£ããã¼ã«ã使ãããã社å ã® ONNX é¢ä¿ã®å¥ã®ãã¼ã«ã¨ã®å調ã¨ããè¦éã«å ¥ãã®ãè¯ãã£ãã§ãã
ãã®ãããã§ ChainerX ã«ã¤ãã¦ã®çè§£ãæ·±ãã¦ããã¾ããã Chainer ã¯è¡åè¨ç®ã¨ãã®éãè¨ç®ã¯ numpy/cupy ã¨ããã®ã«æãã¦ãããã§ããã numpy ã¨ã³ã³ãã㪠ChainerX array ã¨ããã®ã C++ ã§ä½ã£ã¦ã C++ å´ã«ã徿¥ Python ã§å®è£ ããã¦ãã誤差é伿ãæã£ã¦ãããã¨ããã³ã³ã»ããã
åç« ã§ãããã¤ãã§ããªããé度ãé ããã¨ããåé¡ã«è§¦ãã¾ãããã ChainerX ã¯ãããã®åé¡ãå¤§å¹ ã«è»½æ¸ãããã®ã§ãã ChainerX array 㯠C++ ã§æ¸ããã¦ããã®ã§ã Python ç¡ãã®ãããã¤ã®éãéããã¦ããããé度ãé ãä¸çªã®åå ã ã£ããããã誤差é伿ã Python ã§æ¸ããã¦ããã¨ããåé¡ããªããªãã®ã§ããã
ä½ã£ã¦ã¿ã
ã¨ããããä¸ã®ä¸ã«ãããããç¨åº¦å¤§ãããããã¯ã¼ã¯ãåãããããã«ãã¦ããã¾ããã ChainerX ã«åºæ¬çã«å¿ è¦ãªé¢æ°ãããã®ã§ãåºæ¬çã«ã¯ ONNX 㨠ChainerX 颿°ã対å¿ã¥ãã¦ããã ãã§ããæå㯠ChainerX ã使ã C++ ã³ã¼ããçæãã¦ããã®ã§ããããã¹ãã®ã¤ãã¬ã¼ã·ã§ã³ãé ããªãã®ãå«ã£ã¦ã ChainerX ã®é¢æ°ã次ã å¼ãã§ããã ããã¿ãã㪠VM ãå®ç¾©ãã¦ãããã使ãããã«ãã¾ããã ResNet50 ãããã¯å²ã¨ããåãããããªæ°ããã¾ãã
æç³»åã¯è¦ãã¦ãªãã§ããããã®ã¸ãã§èª¤å·®é伿ã®ã°ã©ããçæããã³ã¼ããã§ã£ã¡ãããã®ã§ã¯ãªããã¨æãã¾ããæé©åãããªããããå®è£ ãããã¨ããã¨ãè¨ç®ã°ã©ããç·¨éããã©ã¤ãã©ãªã¨ãã¦æ©è½ã§ããå¿ è¦ãã©ããã¦ãããã®ã§ããã®ãããã® proof-of-concept ã¨ãã¦ãèªåå¾®åãã§ãããã¨ããã®ã¯æä½éã®æ©è½æ ä¿ã¨ããæããã£ãã®ã§ããã
ãããããã¦ãããã¡ã«ãã¤ã³ã¿ã¼ã³ã®æ¹ãåãã ResNet50 ãããã®ã·ã³ãã«ãªãããã¯ã¼ã¯ã ONNX åã§ããããã«ãã¦ããã¦ãå®éã«ãã®ã°ã©ããå ¥åã¨ãã¦ãã¬ã¼ãã³ã°ç¨ã®ã°ã©ããçæã㦠ImageNet ã¨ããã 224x224 ã®ç»åãã¼ã¿ã 1000 種é¡ã«åé¡ãã¿ãããªä½¿ã£ã¦ãã¬ã¼ãã³ã°ãã¿ãããªãã¨ãã§ãã¯ããã¦ããããã«æãã¾ãã
ãã®ã¸ãããã¯æç³»åææ§ã§ãã
EspNet ã end-to-end ã§éããã¨ããæ¥ã
EspNet ã¨ããã®ã¯ãé³å£°èªèãé³å£°åæããã®ä»ãã§ãããã¼ã«ãããã§ãããã®ã¾ãã¾ãè¤éãªã³ã¼ããã¹ãéããã¨åªåãã¦ã¾ãããã¨ããããããã¼ã«ãã§ã¤ã³ã®ä¸ããä¸ã¾ã§ã§ãã«ã¼ããªã©ãã¡ããã¨æ±ãã¾ãããã¨ããç¶æ ã«ãããã¨ããæ°æã¡ããã£ãã®ã§ããããã¿ã¼ã²ããã¨ããæãã§ããã Conv + NStepLSTM + CTC + ãã³ã¼ãã¼ã¯ attention ã¤ãã¦ãããã«ã¼ãåã㦠LSTM ãããã¿ãããªæãã«ãªã£ã¦ã¦ãè²ã ãªãã®ã«å¯¾å¿ããªããã°ãªããªãã®ã§ãã
å ã ã® ONNX ã® Loop ã Scan ã¨ãã£ããªãã¬ã¼ã¿ã¯ãåºå®é·ã® ndarray çãªãã®ã®å ¥åãå ¥ã£ã¦ããåæã ã£ãã®ã§ãããã¯å¯å¤é·ã® Python list ã¨ããæ±ããããã«ããããªããã¨èãã¦ãããã¯çµæ§å¤§å¹ ã«æ¡å¼µããé¨åã§ããã
ã¤ã³ã¿ã¼ã³ã®äººããç¡è¶ã¶ãã«ãé¢ããããã¾ãã¾ããããããã«ã¼ããªã©ãåãããã«ä½ã£ã¦ããã¦ããæãã§ãããå®éãã«ã¼ãåããããã®ä»æ§ã¿ãããªã®ãããã³ã¨æ±ºãããããªããã¡ãã¡ãªã¡ã³ã¿ã¼ã ã£ãã¯ããªã®ã«ãã¡ããã¨ãããªãã«ããã½ãã£ãã®ã§ã¨ã¦ãæè¬ã§ããããããå¼ãç¶ãã§ EspNet ã§å¿ è¦ãªãããªãããããã夿ãªã©ãã§ããããã«åªåãã¦ããã¾ããã __init__ ã§ self.x = None ãã¦ããã¦ãå¾ã§ if self.x is None: self.x = ... ã¨ããããé å»¶åæåã¿ãããªã®ããªããªãé¢åã§ããã
ãããéãã¨ã次ã¯ã«ã¼ãã if ã®å¾®åã¨ããã誤差é伿ãé å¼µã£ã¦ããã¨ã¯ Python list ã¾ãããé伿å®è£ ãã¦ããããããªããªã大å¤ã§ããã
ãã®ããããã«ã¼ããã¡ããã¨åããã¨ãã Python ã® list ãæ±ãããã¨ãã«ãã ãã£ã¦ããã®ã¯ã Chainer ã®ãã¬ãã·ããªãã£ãæãªããããªããªããã¨æã£ã¦ãããã¨ãããã¾ãã dynamic shape ã¨ãå¯å¤é· list æ±ãã¨ãããã¨ãã©ããã¦ãæéãåºãªãå±é¢ã¯åºã¦ããã¨ã¯æãã®ã§ãããã¨ãããããã¬ãã·ããªãã£ã®æ¹ãéè¦ããªã¨ãã㨠dynamic shape ãæ±ãã¤ã¤ãã static ã«æ±ºã¾ãé¨åã¯æ±ºãããã¿ãããªæ¹éã§ãã£ã¦ãã®ã§ã次å ãæ±ºã¾ã£ãã¨ããã¯é«éåâ¦ã¿ãããªãã¨ãã§ããã®ã§ã¯ãªããã¨æã£ã¦ãã¾ããå®è£ ã追ãã¤ãã¦ãªãã§ããã TVM ã®ã³ã¼ãçæä½¿ãå®é¨ã¨ã㯠shape ãããã£ã¦ãåæã§ãã£ã¦ãã¾ãã(ã¨ããã TVM 㯠dynamic shape ã«é¢ãã¦çµå±ãªããè¨ç»ããã®ã ããã)ã
EspNet ãã¾ã¨ããªé度ã«ãããã¨ããæ¥ã
åãããã«ãªã£ãæåã¯ãªãããç´ ã® Chainer ããå§åçã«é ãï¼ã¿ãããªç¶æ ã§ãããã§â¦ä½ãããã§ããã£ããã¡ãã㨠cuDNN ã® LSTM ã使ãããã«ãããã elementwise op ã® fusion ãããã宿°ä¼æãã£ããããªã©ãªã©ã Python ããã°ã©ãçæãã¦ãã¨ããªããã´ãã¿ãããªãã¼ããã§ãã¾ããã®ã§ã宿°ä¼æã¿ãããªã®ãéè¦ãªã®ã§ãããâ¦
ã§ã¾ããã¾ã¨ããªé度ã«ãªã£ã¦ã CPU heavy ãªã±ã¼ã¹ã§ã¯ Chainer ã«åã¤ãªãã¨ããæãã«ãªãã¾ããããã CTC ã¨ãããå¦çãå®è£ ãã¦ãªãã£ãã®ã§ãå®éã« end-to-end ã§è¨ç·´ãããã¨ãã§ããªãã¦ãããããããªã®å®è£ ããã®ãã£ãããã®ã§ã Python ã¤ã³ã¿ã¼ãã§ã¤ã¹ã追å ãã¦ãã¢ãã«ã®ä¸é¨åã ãã chainer-compiler ã§å¦çãããã¿ãããªãã¨ãã§ããããã«ãã¾ããã
ã§ã¾ãããã½ããªãã¾ããã Python ã³ã¼ãã«å¤å°ã®ãæ°æã¡æªã夿´ãå¿ è¦ãªã®ãããªãã¨ãã¯ããªé¨åã§ã¯ããã®ã§ããâ¦
TVM ã§éã¶
å¹´æ«ãããã TVM ã§éã³ã¾ããã LSTM ã¯ãä¼ç¤¾ã¨ãã¦ã¯ç´æ¥ãããªã«éè¦ã§ãªãã¨ãããã¨ããããã¡ãã㨠Conv ã¨ããè¯ãã§ããããã³ã·ã£ã«ã¯ããªãã¦ãããªãã¨ããªãâ¦ã¨ã
çµæã¨ãã¦ã¯ãè²ã é¢ç½ããã©ã Python 㨠C++ è¡ãããã¾ããã®ã³ã¼ããã¤ããã¨ããã®ãã¾ãææ³ã§ããããã¨ãç¹ã«æ®éã® Conv ã¨ãã ã¨ã伸ã³ããããããããã¾ããªãã¦ãæä¸å´åã«å¯¾ãã¦å¾ããããã®ããªãâ¦ã¨ããæ°æã¡ãããã¾ããã
ã§ãã¨ããããä¿çãããã¨ã«ãã¾ããããããã«ããããã¬ãã·ããªãã£ã¨ãã観ç¹ãªã©ãããèªåã§ã«ã¼ãã«ãçæã§ãããªãã·ã§ã³ã¯ä¸æçã«ã¯ããã¹ãã ã¨èãã¦ãã¦ãã©ããã®æ®µéã§æ»ã£ã¦ãããã¨ã«ãªãã¨æã£ã¦ãã¾ãã
ãªã¼ãã³ã½ã¼ã¹å
ãããããã¨ç¡éã«ãããããä¸äººã§ãã£ã¦ãã¨å´©å£ä»¥å¤è¦ããããªãâ¦ã¨æã£ã¦ãã®ã§ãäººãæ¬²ããã§ããã¿ãããªãã¨ããããå§ãã¦ã¾ãããããã°ã¼ã°ã«ã ã¨ã人ãå¢ããããããã¯ãåã®ãããã£ã¦ãããæå³ãªããããããããã¦è¨ãããäºæã§ããããããã£ãã®ã§ãããå°ããä¼ç¤¾ã§ã¿ããªããããå¿ããã¦ã人ãå¢ããªãããåãæ½°ãã«ããªããªããã¨ããé°å²æ°ã§ããã
ã§ãã©ãã社å ã§åããã¨ããããããªãã¦ãå¤ããæ¾ã£ã¦ãããã¨ããæåã ã¨å¦ã³ã¾ããã確ãã«ãåã äººã§æ¾ã£ã¦æ¥ãããã£ã¦ã®ã¯ããªãã»ã©ãã³ãã£ã¼ã®æé·æ¹æ³ã¨ãã¦çã«é©ã£ã¦ãããªããã¨æãã¾ãããã¨ããããã§ãã¤ãã¿ã¼ã§ããããããã¦ã¿ã¾ããã
ãã ããªãããã£ã±ã³ãã¥ãã±ã¼ã·ã§ã³ããã¥ããã¨ãããã¨ãæã£ã¦ãã¦ãã¦ã¼ã¶åããªãªã¼ã¹ãã¨ããæãã§ã¯ãªãã¦ããããããã¨ãã£ã¦ã¾ããã仲éåéãã¨ãããã¨ã§ãªã¼ãã³ã½ã¼ã¹åãããã¨æã£ã¦ããã¾ãããã¨ã¯ããããããªãã«ã¯ãè²ã æ´ããå¿ è¦ããã£ã¦ããããªãã«ã¯ããã©ãã§ããã
ãããã
é©å½ã«é¢¨åæ·ãåºãã¦ãçµæ§åºãç¯å²ã§å®è£ ãã¦ã¿ããã©ãã¨ãããããã¨ããæãã®ä»®ç«ã¦ä»ãã½ãç¶æ ã®é¨åãå¤ãç¶æ ã§ãã¾ã ã¾ã ãããã¨ãç¡éã«ãããªããã¨æã£ã¦ãã¾ãã
åºæ¬çã«ã chainer-compiler ã«ãã ãããã Chainer ã¾ããã§éçãªã°ã©ããæ±ãã·ã¼ã³ã®ã¨ã³ã·ã¹ãã ããå ¨ä½ã¨ãã¦æ´ãã¦ãããããªãã¨æã£ã¦ãã¾ããæè¿ã¡ãã£ã¨ onnx-chainer ã«æãåºãã¦ã¿ããããã¦ããããã¨ãããã®ã¸ãããã³ã¨ãã¦ãªããã¨ããããã¤ã®å¤§å¤ãã¿ãããªãã¨ã«ãç´çµãã¦ãã¾ã£ã¦ããã®ã§ã
ä¸å®å ¨ãªé¨åãããããã ãã«ãã£ã¦ãã©ãããæãã¤ãã¦ãè¯ããããªæãã ãããã£ã±ç¤¾å éè¦ãæºããã¨ãããåªå ããã®ãè¯ãããããã¨æã£ã¦ããã®ã§ã社å éè¦æºããåªåããã¤ã¤ãæ±ç¨çãªãã¼ã«ãã§ã¤ã³ã¨ãã¦å°ããã¤è²ã¦ã¦ãããã¨è¯ããªããã¨ãæã£ã¦ãã¾ãã
ãã¨ä¾ã®ãã¨ãä¸ç·ã«åããã人åéä¸ã§ãããã¾ããããã¯ä¸æã§ããããã種ã®äººã«ã¯ã楽ããã¯ããããããªããã¨æãã¾ããå°ãªãã¨ãåã¯å¤§å¤æ¥½ããã§ãã¾ãã
ONNX ã¯ãã¥ã¼ãªã³ã°å®å ¨ã ããã¨ãã話
ã·ã¯ã·ã¯ç´ æ°å Advent Calendar 2018 åãã§ãã
ONNX ã¯ãã¥ã¼ã©ã«ãããã®ã¢ãã«ãã¨ã¯ã¹ãã¼ããã¦ãå¥ã®å®è£ ã§ã¤ã³ãã¼ãã§ããããããç¸äºéç¨ã®ããã®ãã©ã¼ãããã§ããè¤éãªã¢ãã«ããµãã¼ãã§ããããã«ã¨ã Loop ã¨ã If ã¨ããããã®ã§ããã¥ã¼ãªã³ã°å®å ¨ã§ãããã ã¾ãå®éã«ããã使ããæ¹ãã¦ãä¾ã¯è¦ããã¨ããªãã£ãã®ã§ããã£ã¦ã¿ã¾ããã
https://github.com/shinh/test/blob/master/onnx_gen_4949_prime.py
ãã4ã9ãå«ãç´ æ°ãåºåãã ONNX ã¢ãã«ãåºåããããã°ã©ã ã§ã
$ wget https://raw.githubusercontent.com/shinh/test/master/onnx_gen_4949_prime.py $ wget https://raw.githubusercontent.com/shinh/test/master/onnx_script.py $ python3 onnx_gen_4949_prime.py $ ls gen_4949_prime model.onnx test_data_set_0
ã¨ãã§ ONNX ãã¡ã¤ã«ãåºåã§ãã¾ããå®è¡ã¯ã ONNX ã®ã«ã¼ãã¨ãããµãã¼ããã¦ããå¦çç³»ããã¾ããªãã¨æãã¾ãã®ã§ã ONNX runtime ã¨ãã使ã£ã¦ãã ãã
$ python3
>>> import numpy as np
>>> import onnxruntime
>>> sess = onnxruntime.InferenceSession('gen_4949_prime/model.onnx')
>>> input_name = sess.get_inputs()[0].name
>>> output_name = sess.get_outputs()[0].name
>>> sess.run([output_name], {input_name: np.array(104)})[0]
array([ 19, 29, 41, 43, 47, 59, 79, 89, 97, 109, 139,
149, 179, 191, 193, 197, 199, 229, 239, 241, 269, 293,
347, 349, 359, 379, 389, 397, 401, 409, 419, 421, 431,
433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491,
499, 509, 541, 547, 569, 593, 599, 619, 641, 643, 647,
659, 691, 709, 719, 739, 743, 769, 797, 809, 829, 839,
859, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971,
977, 983, 991, 997, 1009, 1019, 1039, 1049, 1069, 1091, 1093,
1097, 1109, 1129, 1193, 1229, 1249, 1259, 1279, 1289, 1291, 1297,
1319, 1399, 1409, 1423, 1427], dtype=int64)å ¥åã§æå®ãã¦ããã®ã 104 ãªã®ã¯ã 8 ã®åæ°ãããªã㨠ONNX runtime ãã¯ã©ãã·ã¥ããã½ãã£ãããã§ããä»ã«ãããã¤ã ONNX runtime ã®ãã°ããããã®ãè¦ã¤ããæ°ãããã®ã§ãé©å½ã«å ±åãã¦ããã¾ãã
ãã¥ã¼ãªã³ã°å®å ¨ã¨ãããã¨ã§ã ELVM ã®ããã¯ã¨ã³ããä½ã£ã¦ããããã®ã§ããã TensorFlow ã¢ãã«ããã¯ã¨ã³ããé ãã¦å®ç¨ã«ãªããªãã¨ããåé¡ããã£ã¦ã ONNX ãä¼¼ããããªæããªã®ã§ãã©ããããã®ãã¨æã£ã¦ããã®ã§ããããã ããªããæè¿æã£åãæ©ãé«éåããæ¹æ³ãæãã¤ããæ°ãããã®ã§ãä»åº¦ãã£ã¦ã¿ãããã¨æãã¾ãã