æä»£ã¯ãã¼ã«ã«LLMã¨ãããã¨ã§ãã¡ãã£ã¨èå³ããã£ãã®ã§ãiOS/iPadOSä¸ã§ãã¼ã«ã«LLMãåããã¦ã¿ãã
MiniAIChat
ç¿ä½ã¨ãã¦ããã¼ã«ã«LLMã使ã£ã質åå¿çåã®macOSã¢ããªãä½ã£ãããã¤ãã£ãã§æ¸ããã¦ãããApple Platformãªã大ä½åã(Mac/iPhone/iPad/Apple Vision Pro)
質åå¿ç
ã¾ãã¯ãªã¼ã½ããã¯ã¹ãªè³ªåå¿çãããã¦ããããã¼ã«ã«LLMã«ãã¦ã¯ãã£ãããªç²¾åº¦ã§åçã§ãã¦ãããã
åã«ä»¥ä¸ã®ãããªããã³ãããä¸ãã¦ãããå¾è¿°ã®æ¥æ¬èªLLMã®ãµã³ãã«ãåèã«ãã¦ãããããã®ãããªå¬ç è¡ã«å¹æããããã¯ããããªãã
ããªãã¯èª å®ã§åªç§ãªæ¥æ¬äººã®ã¢ã·ã¹ã¿ã³ãã§ããç¹ã«æç¤ºãç¡ãå ´åã¯ã次ã®è³ªåã«å¸¸ã«æ¥æ¬èªã§åçãã¦ãã ããã åçã¯ãåçï¼ãããå§ãã¦ç°¡æ½ã«çãã¦ãã ããã \(text)
JSONã®çæ
ææ³ã«ã¤ãã¦ã¯å¾è¿°ããããç¹å®ã®ã¹ãã¼ãã«é©åããJSONã®çæã試ãã¦ãããæ§é åãã¼ã¿ãåãåºãã®ã«ä½¿ãããã
CoreML VS Llama
Appleãã©ãããã©ã¼ã ã®MLåºç¤ã¨è¨ãã°ãCoreMLãçã£å ã«æãããããããããCoreMLåãã®LLMï¼æ¥æ¬èªãï¼ã¯å å®ãã¦ããªãããä»ã®æ¢åã¢ãã«ãCoreMLä¸ã§åä½ãããã«ã¯ãcoremltoolãHugging Faceã®Exportersãç¨ãã¦ãCoreMLä¸ã§åä½å¯è½ãªå½¢å¼ã«å¤æããªãã¦ã¯ãªããªãã
ãã¼ã«ã«LLMãCore MLã¢ãã«ã«å¤æãã - ð¤ Exporters ã®ä½¿ãæ¹
ãã®è¨äºãæ¸ããã @shu223 ã¨å æ¥é£²ãã§ããã¨ããããCoreMLã®ã¢ãã«å¤æã¯ç¥èããªãã¨ããã£ã¦é£ãããã¨ãã話ãèããã®ã§ãä»åã¯ç´æ¥LlamaãiOSä¸ã§åããã¦ã¿ããã¨ã«ããã
Llama.cpp
Llama.cppã¯C++ããLlamaãæ±ãããã®ã©ã¤ãã©ãªç¾¤ã ãããã¦ãªãã¨Swift Packageçãæä¾ããã¦ããã
ããã«ã¤ãã¦ãããã«ç´ æ´ãããå¿ç¨ä¾ã®è¨äºãæ¢ã«åå¨ãã¦ã ð ä»åã¯ããã大å¤åèã«ããã
åºæ¬çãªè©±ã¯ä¸è¨ã®è¨äºãã»ã¨ãã©ç¶²ç¾ ãã¦ããã¦ãããæ¦å¿µãå¦ãã ãã試ãã¦ã¿ãã®ã¯ãã®è¨äºãåèã«ããã°ååãªã¯ãã ã
䏿¹ã§ããã®è¨äºãæ¸ããã2023å¹´12æããæ¯ã¹ã¦ãç´°ããªäºæ ãããããã¨å¤ãã£ã¦ããã®ã§ããã®è¨äºã§ã¯ãã®å·®åããããã£ãã¨ãããä¸å¿ã«ç´¹ä»ããã
ãµã³ãã«ã³ã¼ãã®ãã£ããã¢ãã
Llama.cppã«ã¯ãSwiftUIã§å®è£ ãããµã³ãã«ã¢ããªã®ã³ã¼ãã忢±ããã¦ãããåºæ¬çã«ãããåèã«ã§ããããæä½éã®æ©è½ããå®è£ ããã¦ããªããããä¸è¿°ã®Zennã®è¨äºã®ãµã³ãã«ã¢ããªãä¸ç·ã«èªã¿è¾¼ãã ã
ã¾ããSwiftå®è£
ã ãã§ã¯ä¸ååã ã£ãã®ã§ãLlama.cppã®ãªãã¸ããªã«å梱ããã¦ãã examples/simple-chat
ã common-sampler
ã®å®è£
ãåèã«ãªã£ãã
ããã¥ã¡ã³ããä»ã®å®ç¨ä¾ãä¸è¶³ãã¦ããã®ã§ãC++ã®ã³ã¼ããèªã¿ãªããSwiftã«ç¿»è¨³ãã¦ãããä¸è¨ã®è¨äºãæ¸ããã1å¹´åãããsamplerãªã©Llama.cppå ã®å¤ãã®å®è£ ã夿´ããã¦ããã®ã§ãPRãªã©ãåç §ããªããç§»æ¤ããã
LLMãé¸ã¶
åºæ¬çã«Hugging FaceãããLlamaç¨ã®ã¢ãã«ãé¸ã³ãå·®ãæ¿ããã ãã§åä½ããããã¨ãã§ããã
ä»åãæ¥æ¬èªã®ã¢ãã«ã¨ãã¦ãELYZAãæä¾ãã¦ããLlama 3ã®LLMãç¨ããããã®ã¢ãã«ã使ãã¨ãæ¥æ¬èªã§ãã£ã¦ãããããã®ç²¾åº¦ã§è³ªåå¿çããã¦ããã¦ãæå¾ 以ä¸ã®è¿çãå¾ãããã
æ¥æ¬èªã«ãã ããå¿ è¦ããªãå ´åã¯ãMetaå ¬å¼ã®Llamaã®ã¢ãã«ã使ãã¨ãããInstructionãCodeLlamaãªã©ãç¨éã«åããã¦å©ç¨ã§ãããã ã£ããè±èªã®æ¹ã精度ãè¯ãã
GBNFã«ããçæçµæã¸ã®å¶ç´
Llama.cppã§ã¯ãGBNFã¨ããææ³å®ç¾©ã®ãã©ã¼ãããã使ã£ã¦ãçæãããæååãå¶ç´ããæ©è½(Grammar)ãæä¾ããã¦ããã
root ::= answer answer ::= "åç:" message message ::= string+ ([ \t\n] string+)* string ::= alnum-char | jp-char alnum-char ::= [^"\\] | "\\" (["\\/bfnrt] | "u" [0-9a-fA-F] [0-9a-fA-F] [0-9a-fA-F] [0-9a-fA-F]) # escapes jp-char ::= hiragana | katakana | punctuation | cjk hiragana ::= [ã-ã] katakana ::= [ã¡-ã¿] punctuation ::= [ã-ã¾] cjk ::= [ä¸-é¿¿]
JSON Schemaã使ã£ã¦GBNFãçæããæ¹æ³ãç¨æããã¦ãããããããæ£ããå®è£ ããã¨*1ãvalidãªJSONãLLMã«åããããã¨ãã§ããã
ãªã³ã©ã¤ã³ã³ã³ãã¼ã¿ã¼ãæä¾ããã¦ããã®ã§ããã®è¾ºãå·®ãæ¿ããã ãã§ãå è¿°ã®JSONã®çæã®ãããªãããã¨ããã£ã½ãã¢ããã§ãããæ£è¦åãã¼ã¿ãã§ãã¦ãã¾ãã°ãããããå¿ç¨ãå©ãããã ã
å è¿°ã®è¨äºã®æ®µéã§ã¯ãLlama.cppã®ã©ã¤ãã©ãªé¨åã«GBNFã®ãã¼ãµã¼ããªããæ¬ä½ã®ã³ã¼ããç§»æ¤ããªãããªã©ãããã¯ãå¿ è¦ã ã£ãããã ããæ¬ç¨¿å·çæç¹ã§ã¯ãGBNFã®ãã¼ãµã¼é¨åãã©ã¤ãã©ãªã¨ãã¦æä¾ãããããã«ãªã£ãããã§ãè¨äºã§è§¦ãããã¦ãããããªææ³ãæ¡ããã¨ãGrammarã®çæãè¡ããã
ãã¼ã¯ã³çæã®AsyncSequence
対å¿
Llama.cppã«å梱ããã¦ããSwiftã®ãµã³ãã«å®è£
ã§ã¯actor
ãç¨ãã¦ãçæç¶æ
ãç£è¦ãã¦ç¡éã«ã¼ãããã¨ããå®è£
ã«ãªã£ã¦ããããã©ãã«ãæ±ãã¥ããAPIãªã®ã§ãAsyncSequence
ã使ã£ããã®ã«æ¸ãæãã¦ã¿ãã
let session: some AsyncSequence = llamaContext.startGeneration(for: prompt) Task { for try await result in session { guard !Task.isCancelled else { break } guard case .piece(let newPiece) = result else { break } await MainActor.run { self.text += newPiece } } }
ããã¨è¦ãå¤ããã®ä½¿ãåæã¯è¯ããªã£ãããã«æããããçµå±Sequenceã®å é¨ã¯UnsafePointerã®æä½ãé è½ãã¦ããã®ã§ãã¾ã綺éºã«ãªã£ã¦ããªãã
ãã¼ã¯ã³ã¯éåæã«æ°æåãã¤çæãããã®ã§ãAsyncã«æ±ãããã®æ ¼å¥½ã®é¡æã ã0ããSequence
ãIterator
ãæ¸ããã¨ãå°ãªãã®ã§ãMastering AsyncSequenceãèªã¿ç´ãæ©ä¼ã«ããªã£ã¦è¯ãã£ãã
ææ
Llama.cppã¨C++ interoperability
è¿å¹´ã®Swiftã§ã¯ãC++ interoperabilityããµãã¼ããããC++ã®ã©ã¤ãã©ãªãããç¨åº¦ãã®ã¾ã¾æ±ããããã«ãªã£ã¦ãã¦ããã䏿¹ã§ãç¾ç¶ã®Llama.cppã®Swift Packageã¯ãPackageDescriptionã5.5ã¨å¤ããC++ Interopãæä¾ãã¦ããªãããã®ãããå®è³ªçã«ã¯Cã¤ã³ã¿ã¼ãã§ã¤ã¹ããèªãããUnsafePonter
ã§APIãã´ãªã´ãªã¨æä½ããå¿
è¦ããããï¼ã¤ããã£ãï¼
Swiftããã±ã¼ã¸å´ãã¢ãã³åããã°ãC++ã®æ§é ä½ãã¯ã©ã¹ãªã©ãç´æ¥Swiftå´ã§æä½ã§ããããã«ãªãã®ã§ãããç¨åº¦ä½¿ãåæã¯è¯ããªããã・・・・・・ã
Llama.cppã®ãã¼ã¸ã§ãã³ã°åé¡
ä¸è¨ã® AsyncSequence
åãªã©ããã£ããæ¸ããã®ã§ããã£ã¨Swiftããæ±ããããå½¢ã§ã©ã¤ãã©ãªãæä¾ããããã¨èãã¦ããããLlama.cppèªä½ã«ä¾åããã®ã¯ç¾ç¶å±ãªããã«æããã
Llama.cppã«ãã¾ãããã¥ã¡ã³ãããªããã¨ã«å ããsemverãæ¡ç¨ãã¦ããããä»ç¾å¨ããã©ã¹ãã£ãã¯ã«å®è£ ã夿´ããã¦ããããã ãç¾ã«ãæåã«ç´¹ä»ããè¨äºããããã1å¹´ã§å¤ãã®å ¬éAPIã夿´ããã¦ããã
ä»åã¯å¦ç¿ã®ããã®ãã¤ããã¸ã§ã¯ããªã®ã§ãã¡ã³ããã³ã¹æ§ãªã©ãèãã䏿¦ãã以ä¸ã®çºå±ã諦ããã
Appleããã¤ã¹ã¨ãã¼ã«ã«LLM
éçºã®å¤§é¨åã¯macOSåãã®ãã«ãã§è¡ã£ã¦ãããã宿©(iPhone 16 Pro, iPad Pro(M4))ã§ãã¼ã«ã«LLMãåããã¦ã¿ãã¨ãå è¿°ã®ELYZAã®Llama 3ã¢ãã«ãã¯ãããå¤ãã®LLMã¯ç´ç²ã«ã¡ã¢ãªä¸è¶³ã§åããªãã£ããLlama3ã®ã¢ãã«ã¯4bitéååã®ã¢ãã«ããæä¾ããã¦ãããããããæå°ãµã¤ãºãªã®ã§ã宿©ã§åããã«ã¯Llama 2.7ã®ã¢ãã«ã使ããããªãã£ãã
宿©ã§å©ç¨å¯è½ãªã¢ãã«ã¯æ¥æ¬èªã ã¨ã覧ã®éãã®ç²¾åº¦ããåºãªããããå®ç¨ã«ã¯ã»ã©é ãããã®ä¸ãã¦ã¼ã¶ã¼ã«2GBãã®ã¹ãã¬ã¼ã¸ãè¦æ±ãã¦ãã¾ããæ±ç¨LLMã¯ç¾æç¹ã§ã¯å®ç¨ã«èããªãã ããã
ã¨ã³ãã¦ã¼ã¶ã¼ããããã¨ãã¹ãããã¿ãã¬ããã«ãããªã«ã¡ã¢ãªããããããã¨èãã¦ãããã©ããã¼ã«ã«LLMãã¾ã¨ããªç²¾åº¦ã§åããã«ã¯ãç¾ç¶ãå ¨ãRAMãè¶³ãã¦ãªããã¨ãããã£ããä»å¹´åºãã°ããã®iPad Pro(M4)ã§ãã8GB*2ã§å ¨ç¶è¶³ããªãã
䏿¹ã§ãMacBookã¨åãããããè¼ãã¦ããiPadã®Mã·ãªã¼ãºã¯ãã¡ãããç¾è¡ã®iPhoneã®Aã·ãªã¼ãºã§ãè¨ç®ãªã½ã¼ã¹ã¯ååã«è¦ãããè¨ç®éãããRAMãããã«ããã¯ã«ãªã£ã¦ããã®ã¯ç´æã«åãã¦ãã¦é¢ç½ãã
ãããã«
伿¥1æ¥ + αãããã§Llama.cppã®å®è£ ãèªãã ããLLMã«ã¤ãã¦ç°¡åã«å¦ã¹ããç¹ã«ãç¾ç¶ã ã¨ãã¯ããªã¢ãã£ä»¥ä¸ã«ã¯ä½¿ãç©ã«ãªããªãã¨ããç¹ãèæãæã£ã¦çè§£ã§ããã®ã¯è¯ãã£ãã
LLMã«ã¤ãã¦ããç¾ç¶ã®éçããå½¢å¼ã»éååã®ææ³ãªã©ãããã¤ããã£ããã¢ãããããã¨ãã§ãããã¨ã¯ãããåã¯æ©æ¢°å¦ç¿ã«ã¤ãã¦ã¯ç´ 人ãªã®ã§ãèå¿ãªã¢ãã«ãã©ã®ããã«å¦ç¿ããã¦ããããã¨ããé¨åã«ã¤ãã¦ã¯å ¨ãç¥èããªãããã®è¾ºããã©ãã¯ããã¯ã¹ã«ãªã£ã¦ããã®ã¯å±ãããªã¨æãã¤ã¤ããå ¨ã¦ã¯æ¼ãããããªããªã¨ããæ°æã¡ãããã
ä½é¨ã¨ãã¦ã¯ã3Dã¢ããªã³ã°ãã§ããã¨ããUnityã使ã£ã¦æ¾ã£ã¦ããç´ æã§ãªãã¨ãªãã²ã¼ã ãã§ããã¨ãã£ãæè¦ã«è¿ãã£ãã
Llama.cppã®ç¿å¾ã«ã¤ãã¦ã¯ãä¸è¨ã®è¨äºä»¥å¤ã«ã»ã¨ãã©æ å ±ããªããããã¥ã¡ã³ãã¼ã·ã§ã³ãä¹ããã®ã§ããã®è¨äºãèå³ã®ããæ¹ã®å½¹ã«ç«ã¦ã°å¹¸ãã