рдореБрдЦреНрдп рд╕рд╛рдордЧреНрд░реА рдкрд░ рдЬрд╛рдПрдБ

Gemma 3 270M: рдбреЗрдореЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рдЧрд╛рдЗрдб (Android рдРрдк)

рдЬрд╛рдиреЗрдВ рдХрд┐ Android рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ Gemma 3 270M рдореЙрдбрд▓ рдХреЛ рдХреИрд╕реЗ рд╕реЗрдЯ рдЕрдк, рдЗрдВрдЯреАрдЧреНрд░реЗрдЯ рдФрд░ рд░рди рдХрд░реЗрдВ, рд╕рд╛рде рд╣реА рдСрди-рдбрд┐рд╡рд╛рдЗрд╕ рдЗрдиреНрдлрд░реЗрдВрд╕ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рдФрд░ рд╕реБрд░рдХреНрд╖рд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рд╕рд░реНрд╡реЛрддреНрддрдо рдкреНрд░рдерд╛рдПрдБред
┬╖ 12 рдорд┐ре░ рдкрдврд╝реЗрдВ

AI рдХреЗ рд╕рд╛рде рдЦреЛрдЬреЗрдВ

Google рдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ Gemma 3 270M рдЬрд╛рд░реА рдХрд┐рдпрд╛ рд╣реИтАФ270 рдорд┐рд▓рд┐рдпрди рдкреИрд░рд╛рдореАрдЯрд░реНрд╕ рд╡рд╛рд▓рд╛ рдПрдХ рдЕрд▓реНрдЯреНрд░рд╛-рдХреЙрдореНрдкреИрдХреНрдЯ рдореЙрдбрд▓, рдЬреЛ рдХреБрд╢рд▓ AI рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯ рдХреЗ рдПрдХ рдирдП рдкреИрд░рд╛рдмрд┐рдЧреНрдо рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред рд╡рд┐рд╢рд╛рд▓ рдЬрдирд░рд▓-рдкрд░реНрдкрдЬрд╝ рдореЙрдбрд▓реЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, Gemma 3 270M рдХреЛ рдЯрд╛рд╕реНрдХ-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдлрд╛рдЗрди-рдЯреНрдпреВрдирд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рд╣реА рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рднреА рдмрдирд╛рдП рд░рдЦрддрд╛ рд╣реИред

рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ Gemma 3 270M рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдХрд░рдирд╛ рджрд┐рдЦрд╛рдКрдБрдЧрд╛ рдФрд░ рдпрд╣ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реВрдБрдЧрд╛ рдХрд┐ рдпрд╣ рдЙрди рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдХреНрдпреЛрдВ рдмреЗрд╣рддрд░реАрди рд╡рд┐рдХрд▓реНрдк рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

  • рдмреЗрд╣рдж рддреЗрдЬрд╝ рдЗрдиреНрдлрд░реЗрдВрд╕, рдмрд╣реБрдд рдХрдо рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рдУрд╡рд░рд╣реЗрдб рдХреЗ рд╕рд╛рде
  • рдмреЗрд╣рдж рдЕрдзрд┐рдХ рдКрд░реНрдЬрд╛ рджрдХреНрд╖рддрд╛ (Pixel 9 Pro рдкрд░ 25 рдмрд╛рддрдЪреАрддреЛрдВ рдореЗрдВ рдорд╛рддреНрд░ 0.75% рдмреИрдЯрд░реА рдЙрдкрдпреЛрдЧ)
  • INT4 рдкреНрд░рд┐рд╕рд┐рд╢рди рдХреЗ рд╕рд╛рде рдХреНрд╡рд╛рдВрдЯрд╛рдЗрдЬрд╝реЗрд╢рди рдФрд░ рдиреНрдпреВрдирддрдо рдкрд░рдлреЙрд░реНрдореЗрдВрд╕ рд▓реЙрд╕
  • рдкреВрд░реНрдг рдСрди-рдбрд┐рд╡рд╛рдЗрд╕ рдПрдХреНрдЬрд╝реАрдХреНрдпреВрд╢рди рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдкреВрд░реНрдг рдЧреЛрдкрдиреАрдпрддрд╛

рд╣рдо рдЕрдкрдиреЗ рдкрд╛рдардХреЛрдВ рдХреЛ рдирд╡реАрдирддрдо AI рдЕрдкрдбреЗрдЯреНрд╕ рд╕реЗ рдЕрд╡рдЧрдд рд░рдЦрддреЗ рд╣реИрдВ The Median рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗтАФрд╣рдорд╛рд░рд╛ рдореБрдлрд╝реНрдд рд╢реБрдХреНрд░рд╡рд╛рд░ рдиреНрдпреВрдЬрд╝рд▓реЗрдЯрд░, рдЬреЛ рд╣рдлрд╝реНрддреЗ рдХреА рдкреНрд░рдореБрдЦ рдЦрдмрд░реЛрдВ рдХреЛ рд╕рд░рд▓рддрд╛ рд╕реЗ рд╕рдордЭрд╛рддрд╛ рд╣реИред рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд░реЗрдВ рдФрд░ рд╕рдкреНрддрд╛рд╣ рдореЗрдВ рдХреБрдЫ рд╣реА рдорд┐рдирдЯреЛрдВ рдореЗрдВ рдЕрдкрдбреЗрдЯ рд░рд╣реЗрдВ:

Gemma 3 270M рдХреНрдпрд╛ рд╣реИ?

Gemma 3 270M рдПрдХ рдХреЙрдореНрдкреИрдХреНрдЯ рдлрд╝рд╛рдЙрдВрдбреЗрд╢рди рдореЙрдбрд▓ рд╣реИ, рдЬрд┐рд╕реЗ рдХреЗрд╡рд▓ 270 рдорд┐рд▓рд┐рдпрди рдкреИрд░рд╛рдореАрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рдордЬрд╝рдмреВрдд рдирд┐рд░реНрджреЗрд╢-рдЕрдиреБрд╕рд░рдг рдФрд░ рд╕реНрдЯреНрд░рдХреНрдЪрд░реНрдб рдЯреЗрдХреНрд╕реНрдЯ рдЬреЗрдирд░реЗрд╢рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ Gemma 3 рдкрд░рд┐рд╡рд╛рд░ рдХрд╛ рд╕рдмрд╕реЗ рдЫреЛрдЯрд╛ рд╕рджрд╕реНрдп рд╣реИ, рдлрд┐рд░ рднреА рдпрд╣ рдмрдбрд╝реЗ рд╡реЗрд░рд┐рдПрдВрдЯреНрд╕ рдЬреИрд╕реЗ Gemma 3 1B рдФрд░ 4B рдХреА рд╣реА рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдФрд░ рдЯреНрд░реЗрдирд┐рдВрдЧ рд░реЗрд╕рд┐рдкреАрдЬрд╝ рдЕрдкрдирд╛рддрд╛ рд╣реИред

рдЬрдирд░рд▓-рдкрд░реНрдкрдЬрд╝ рдмрдбрд╝реЗ рдореЙрдбрд▓реЛрдВ рдХреЗ рд╡рд┐рдкрд░реАрдд, Gemma 3 270M рдХрд╛ рдлрд╝реЛрдХрд╕ рджрдХреНрд╖рддрд╛ рдФрд░ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдкрд░ рд╣реИред рдЗрд╕ рдореЙрдбрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдкреНрд░рдореБрдЦ рдмрд┐рдВрджреБ:

  • рдпрд╣ рдореЛрдмрд╛рдЗрд▓ рдбрд┐рд╡рд╛рдЗрд╕реЛрдВ рдкрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдЪрд▓рддрд╛ рд╣реИ; рдХреНрд╡рд╛рдВрдЯрд╛рдЗрдЬрд╝реНрдб рдЗрдиреНрдлрд░реЗрдВрд╕ (INT4, Q8, рдФрд░ рдЕрдиреНрдп) рдХрдИ рдмрд╛рддрдЪреАрддреЛрдВ рдореЗрдВ 1% рд╕реЗ рдХрдо рдмреИрдЯрд░реА рдХреА рдЦрдкрдд рдХрд░рддрд╛ рд╣реИред
  • рдЗрд╕рдореЗрдВ 100M рдЯреНрд░рд╛рдВрд╕рдлрд╝реЙрд░реНрдорд░ рдкреИрд░рд╛рдореАрдЯрд░реНрд╕ рдФрд░ 170M рдХрд╛ рдмрдбрд╝рд╛ рдПрдореНрдмреЗрдбрд┐рдВрдЧ рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╣реИ, рдЬреЛ 256,000 рдЯреЛрдХрдиреНрд╕ рдХреА рд╢рдмреНрджрд╛рд╡рд▓реА рд╕рдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИтАФрдбреЛрдореЗрди-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рдиреЛрдВ рдореЗрдВ рд░реЗрдпрд░ рдЯреЛрдХрдиреНрд╕ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ред
  • рдЗрдВрд╕реНрдЯреНрд░рдХреНрд╢рди-рдЯреНрдпреВрди рдХрд┐рдП рдЧрдП рдЪреЗрдХрдкреЙрдЗрдВрдЯреНрд╕ рднреА рдЙрдкрд▓рдмреНрдз рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдХреНрд▓рд╛рдЙрдб рдХрдиреЗрдХреНрдЯрд┐рд╡рд┐рдЯреА рдХреЗ рдмрд┐рдирд╛ рдЕрд╕рд┐рд╕реНрдЯреЗрдВрдЯреНрд╕, рдбреЗрдЯрд╛ рдПрдХреНрд╕рдЯреНрд░реИрдХреНрдЯрд░реНрд╕ рдФрд░ рдХреНрд░рд┐рдПрдЯрд┐рд╡ рд░рд╛рдЗрдЯрд┐рдВрдЧ рдЯреВрд▓реНрд╕ рдмрдирд╛рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

IFEval рдкрд░ Gemma 3 270M рдХрд╛ рдкреНрд░рджрд░реНрд╢рди

Gemma 3 270M рдореЗрдВ рдЕрдЪреНрдЫреА рдирд┐рд░реНрджреЗрд╢-рдЕрдиреБрд╕рд░рдг рдХреНрд╖рдорддрд╛рдПрдБ рд╣реИрдВтАФIFEval рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдореЙрдбрд▓ рдХреА рд╕рддреНрдпрд╛рдкрдиреАрдп рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реИред рд╕реНрд░реЛрдд: Google

32K рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рд╡рд┐рдВрдбреЛ, рдХрдо рдореЗрдореЛрд░реА рдЙрдкрдпреЛрдЧ, рдФрд░ рдПрдВрдЯрд┐рдЯреА рдПрдХреНрд╕рдЯреНрд░реИрдХреНрд╢рди, рдХреНрд▓рд╛рд╕рд┐рдлрд┐рдХреЗрд╢рди, рд╡ рд╣рд▓реНрдХреЗ рдЕрдиреБрдкрд╛рд▓рди-рдЬрд╛рдБрдЪ рдЬреИрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдордЬрд╝рдмреВрдд рд╕рдЯреАрдХрддрд╛ рдХреЗ рд╕рд╛рде, Gemma 3 270M рдЙрди рдПрдЬ AI рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ рдЬреЛ рдЧреЛрдкрдиреАрдпрддрд╛, рдЧрддрд┐ рдФрд░ рд▓рд╛рдЧрдд-рджрдХреНрд╖рддрд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

Gemma 3 270M рддрдХ рдХреИрд╕реЗ рдкрд╣реБрдБрдЪреЗрдВ?

рдЖрдкрдХреЗ рдкрд╕рдВрджреАрджрд╛ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рдЕрдиреБрд╕рд╛рд░, Gemma 3 270M рдХреЗ рд╕рд╛рде рд╢реБрд░реБрдЖрдд рдХрд░рдиреЗ рдХреЗ рдХрдИ рдЖрд╕рд╛рди рддрд░реАрдХреЗ рд╣реИрдВ:

1. Cloud Run

рдЖрдк Gemma 3 рдХреЛ Google Cloud Run рдкрд░ рдкреНрд░реАрдмрд┐рд▓реНрдЯ GPU-рдПрдХреНрд╕реЗрд▓рд░реЗрдЯреЗрдб рдХрдВрдЯреЗрдирд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдХреЗрд▓реЗрдмрд▓ рдЗрдиреНрдлрд░реЗрдВрд╕ рдХреЗ рд▓рд┐рдП рдбрд┐рдкреНрд▓реЙрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред Gemma 3 270M рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЕрдкрдирд╛ рдХрдВрдЯреЗрдирд░ Gemma-on-CloudRun GitHub repo рд╕реЗ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдХреЗрд╡рд▓ рдмрдбрд╝реЗ рд╡реЗрд░рд┐рдПрдВрдЯреНрд╕ (1B+) рд╣реА рдкреНрд░реАрдмрд┐рд▓реНрдЯ рд╣реИрдВред рд╡реЗрдм рдпрд╛ рдмреИрдХрдПрдВрдб рдПрдкреНрд▓рд┐рдХреЗрд╢рдиреЛрдВ рдХреЗ рд▓рд┐рдП рддреЗрдЬрд╝, рд╕реБрд░рдХреНрд╖рд┐рдд рдФрд░ рдХрд┐рдлрд╝рд╛рдпрддреА рдЗрдиреНрдлрд░реЗрдВрд╕ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рд╣реЗрддреБ Google Cloud Run рдХреЗ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЧрд╛рдЗрдб рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВред

2. Android (рдЕрдиреБрд╢рдВрд╕рд┐рдд)

рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдиреБрднрд╡ рдСрди-рдбрд┐рд╡рд╛рдЗрд╕ рд╣реЛрддрд╛ рд╣реИ, Gemma 3 270M рдХреЗ рдХреНрд╡рд╛рдВрдЯрд╛рдЗрдЬрд╝реНрдб рд╡рд░реНрдЬрд╝рди (gemma3-270m-it-q8) рдФрд░ Google рдХреЗ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ Gemma Gallery App рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдПред рдпрд╣ рддрд░реАрдХрд╛ рдЕрддреНрдпрдВрдд рддреЗрдЬрд╝ рдСрдлрд╝рд▓рд╛рдЗрди рдЗрдиреНрдлрд░реЗрдВрд╕, рдордЬрд╝рдмреВрдд рдЧреЛрдкрдиреАрдпрддрд╛, рдФрд░ рдиреНрдпреВрдирддрдо рдмреИрдЯрд░реА рдЙрдкрдпреЛрдЧ рджреЗрддрд╛ рд╣реИред

3. рд▓реЛрдХрд▓ рдЗрдиреНрдлрд░реЗрдВрд╕

рдЖрдк рдЕрдкрдиреЗ рд▓реИрдкрдЯреЙрдк рдкрд░ рднреА рдирд┐рдореНрди рдЯреВрд▓реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Gemma 3 270M рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ:

  • LM Studio: рдЕрдкрдиреЗ LM Studio рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ .gguf рдпрд╛ .litertlm рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╡рд╛рд▓рд╛ рдореЙрдбрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдЙрд╕реЗ рддреБрд░рдВрдд рдЪреИрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдЪрд▓рд╛рдПрдБ рдпрд╛ рд▓реЛрдХрд▓реА рд╣реЛрд╕реНрдЯ рдХрд░реЗрдВред
  • Ollama: рдЖрдк ollama run gemma3:270m рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рдореЙрдбрд▓ рдХреЛ рдЕрдкрдиреА рдорд╢реАрди рдкрд░ рд▓реЛрдХрд▓реА рд░рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
  • Llama.cpp: рдпрд╣ рднреА Gemma 3 270M рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдЕрд▓реНрдЯреНрд░рд╛-рд▓рд╛рдЗрдЯрд╡реЗрдЯ CPU рдЗрдиреНрдлрд░реЗрдВрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
  • Docker: рдЖрдк Docker рдХрдВрдЯреЗрдирд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рднреА Gemma 3 рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВтАФрдпрд╛ рддреЛ Hugging Face рд╕реЗ рдпрд╛ Gemma рдХреЗ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ GitHub рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА рд╕реЗред
  • HuggingFace: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ HuggingFace рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реАрдзреЗ рдЗрд╕ рдореЙрдбрд▓ рддрдХ рдкрд╣реБрдБрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЗрдиреНрдлрд░реЗрдВрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рд▓реЛрдХрд▓ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдкреНрд░реАрдЯреНрд░реЗрдВрдб рдФрд░ рдЗрдВрд╕реНрдЯреНрд░рдХреНрд╢рди-рдЯреНрдпреВрди рджреЛрдиреЛрдВ рдореЙрдбрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

4. рдореЙрдбрд▓ рдХреЛ рдлрд╛рдЗрди-рдЯреНрдпреВрди рдХрд░реЗрдВ

Gemma 3 270M, Hugging Face Transformers, JAX, рдпрд╛ Unsloth рдореЗрдВ рднреА рдЙрдкрд▓рдмреНрдз рд╣реИ рддрд╛рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рдбреЛрдореЗрди-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдбреЗрдЯрд╛ рдкрд░ рдлрд╛рдЗрди-рдЯреНрдпреВрди рдХрд░ рд╕рдХреЗрдВред рдореЙрдбрд▓ рдХрд╛ рдЫреЛрдЯрд╛ рдЖрдХрд╛рд░ рддреЗрдЬрд╝, рдХрдо-рд▓рд╛рдЧрдд рд╡рд╛рд▓реЗ рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ рд╣реИ, рдФрд░ QAT рдЪреЗрдХрдкреЙрдЗрдВрдЯреНрд╕ рдлрд╛рдЗрди-рдЯреНрдпреВрдирд┐рдВрдЧ рдХреЗ рдмрд╛рдж рд╕реАрдзреЗ INT4 рдбрд┐рдкреНрд▓реЙрдпрдореЗрдВрдЯ рд╕рдХреНрд╖рдо рдХрд░рддреЗ рд╣реИрдВред

рдЕрдЧрд▓реЗ рдЪрд░рдг рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ Android рдРрдк рдмрдирд╛рдирд╛ рд╕рд┐рдЦрд╛рдКрдБрдЧрд╛ рдЬреЛ рдЯреЗрдХреНрд╕реНрдЯ рдкреНрд░реЙрдореНрдкреНрдЯреНрд╕ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Gemma 3 270M рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╣рдо Google рдХреА рдЖрдзрд┐рдХрд╛рд░рд┐рдХ Gallery рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА рдХреЛ рдмреЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЙрд╕реЗ рдХрд╕реНрдЯрдорд╛рдЗрдЬрд╝ рдХрд░реЗрдВрдЧреЗред

рдЪрд░рдг 1: рдРрдк рдХреЛ рдХреНрд▓реЛрди рдФрд░ рд╕реЗрдЯ рдЕрдк рдХрд░реЗрдВ

рдЖрдЗрдП рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗрдЯ рдЕрдк рдХрд░рдХреЗ рдФрд░ Google рдХреА рдореМрд▓рд┐рдХ рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА рдХреЛ рдХреНрд▓реЛрди рдХрд░рдХреЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

рдЪрд░рдг 1.1: рдирдпрд╛ Android Studio рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдБ

рдЕрдкрдиреЗ рд▓реИрдкрдЯреЙрдк рдкрд░, Android Studio рдореЗрдВ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдПрдХ рдирдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЦреЛрд▓реЗрдВ рдФрд░ Empty Activity рдЪреБрдиреЗрдВред

Gemma 3 270M рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП Android Studio New Project рд╡рд┐рдВрдбреЛ

рдЪрд░рдг 1.2: рдирдИ рдЦрд╛рд▓реА рдПрдХреНрдЯрд┐рд╡рд┐рдЯреА рд╕реЗрдЯ рдЕрдк рдХрд░реЗрдВ

рдЗрд╕рдХреЗ рдмрд╛рдж, рдЕрдкрдиреА рдПрдХреНрдЯрд┐рд╡рд┐рдЯреА рдХрд╛ рдирд╛рдо рднрд░реЗрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, тАЬGemma 3 270MтАЭ) рдФрд░ рдмрд╛рдХреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдпрдерд╛рд╡рдд рд░рдЦреЗрдВред рдлрд┐рд░, Finish рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред

рдЪрд░рдг 1.3: рдореБрдЦреНрдп рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА рдХреНрд▓реЛрди рдХрд░реЗрдВ

рдЕрдм, Android Studio рдХреЗ рднреАрддрд░ (рдмрд╛рдПрдБ рдиреАрдЪреЗ) рдЯрд░реНрдорд┐рдирд▓ рдЦреЛрд▓реЗрдВ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд bash рдХрдорд╛рдВрдбреНрд╕ рдЪрд▓рд╛рдПрдБ:

git clone https://github.com/google-ai-edge/gallery
cd gallery/android

Gemma 3 270M рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП Android Studio рдЯрд░реНрдорд┐рдирд▓

рдЗрд╕рд╕реЗ рдЖрдкрдХрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЦреБрд▓реЗрдЧрд╛ред рдЖрдк рдЯреИрдм рдХреЗ рдмрд╛рдПрдБ рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рд╕рднреА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝рд╛рдЗрд▓реЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред

Android Studio рдлрд╝рд╛рдЗрд▓реЗрдВ

рдЪрд░рдг 2: рдореЙрдбрд▓ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ

Gemma 3 270M рдореЙрдбрд▓ рдХреЛ рдЕрдкрдиреА Android рдРрдк рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕реЗ рдРрдк рдХреА Tasks.kt рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрджрд░ рдПрдХ рдирдП рдЯрд╛рд╕реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

data/ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЬрд╛рдПрдБ рдФрд░ Tasks.kt рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВред рд╡рд╣рд╛рдБ, рдЖрдк рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдореЙрдбрд▓ рдХреЗ Q8 рдХреНрд╡рд╛рдВрдЯрд╛рдЗрдЬрд╝реНрдб рд╡реЗрд░рд┐рдПрдВрдЯ gemma3-270m-it-q8 рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рдЯрд╛рд╕реНрдХ рдПрдВрдЯреНрд░реА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рд▓реЛ-рдореЗрдореЛрд░реА рдФрд░ рдСрди-рдбрд┐рд╡рд╛рдЗрд╕ рдЗрдиреНрдлрд░реЗрдВрд╕ рдХреЗ рд▓рд┐рдП рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реНрдб рд╣реИред рдпрд╣ рдлрд╝реЙрд░реНрдореЗрдЯ рд╕реАрдорд┐рдд RAM рд╡рд╛рд▓реЗ рдореЛрдмрд╛рдЗрд▓ рдбрд┐рд╡рд╛рдЗрд╕реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИред

Tasks.kt рдлрд╝рд╛рдЗрд▓ рд╕реНрдерд╛рди

рдиреЛрдЯ: рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЗ рд▓рд┐рдП, рдореИрдВ Q8 рдореЙрдбрд▓ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдБрдЧрд╛, рдЬреЛ рдХрдо рдореЗрдореЛрд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд░рдЦрддрд╛ рд╣реИред рдЖрдк рдпрд╣ рдореЙрдбрд▓ рдпрд╣рд╛рдБ рдПрдХреНрд╕реЗрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: https://huggingface.co/litert-community/gemma-3-270m-it

val TASK_GEMMA_3_270M = Task(
  type = TaskType.LLM_PROMPT_LAB,
  icon = Icons.Outlined.Widgets,
  models = mutableListOf(
    Model(
      name = "gemma3-270m-it-q8",
      downloadFileName = "gemma3-270m-it-q8.task",
      url = "https://huggingface.co/litert-community/gemma-3-270m-it/resolve/main/gemma3-270m-it-q8.task",
      sizeInBytes = 318_767_104L
    )
  ),
  description = "Gemma 3 270M (Q8): On-device instruction-following LLM",
  docUrl = "https://ai.google.dev/gemma",
  sourceCodeUrl = "https://github.com/google-ai-edge/gallery",
  textInputPlaceHolderRes = R.string.chat_textinput_placeholder
)

рдЗрд╕рдХреЗ рдмрд╛рдж, рдореБрдЦреНрдп рдЯрд╛рд╕реНрдХ рд╕реВрдЪреА рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдХреЗ рдЗрд╕ рдирдП рдЯрд╛рд╕реНрдХ рдХреЛ рдРрдк рдореЗрдВ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░реЗрдВ:

/** All tasks */
val TASKS: List<Task> = listOf(
  TASK_LLM_ASK_IMAGE,
  TASK_LLM_CHAT,
  TASK_LLM_PROMPT_LAB,
  TASK_IMAGE_CLASSIFICATION,
  TASK_TEXT_CLASSIFICATION,
  TASK_IMAGE_GENERATION,
  TASK_GEMMA_3_270M
)

рдпрд╣рд╛рдБ рдХреЛрдб рдореЗрдВ рдирдП LiteRT рдЯрд╛рд╕реНрдХ рдбрд┐рдлрд┐рдирд┐рд╢рди рдХрд╛ рд╡рд┐рд╡рд░рдг рд╣реИ:

  • рдирдпрд╛ рдЯрд╛рд╕реНрдХ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ: TASK_GEMMA_3_270M рд╡реИрд░рд┐рдПрдмрд▓ рдРрдк рдХреА Tasks.kt рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрджрд░ Gemma 3 270M рдХреЛ рдПрдХ рдЪрдпрди рдпреЛрдЧреНрдп рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдпрд╣ рдЯрд╛рд╕реНрдХ рд╕реВрдЪреА рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗред
  • .task рдлрд╝рд╛рдЗрд▓ рд▓рд┐рдВрдХ рдХрд░рдирд╛: рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб Hugging Face рдкрд░ рд╣реЛрд╕реНрдЯреЗрдб gemma3-270m-it-q8.task рдмрдВрдбрд▓ рдХреА рдУрд░ рд╕рдВрдХреЗрдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдРрдк рдХреЗ рднреАрддрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдЙрдкрдпреЛрдЧ рд╣реЛрддрд╛ рд╣реИред
  • рдореЙрдбрд▓ рд╡рд┐рд╡рд░рдг: .task рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдХреНрд╡рд╛рдВрдЯрд╛рдЗрдЬрд╝реНрдб рдореЙрдбрд▓ рд╡реЗрдЯреНрд╕, рдЯреЛрдХрдирд╛рдЗрдЬрд╝рд░, рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧреНрд╕ рд╣реЛрддреЗ рд╣реИрдВ, рдЬреЛ LiteRT рдХреЛ рдореЙрдбрд▓ рдХреБрд╢рд▓рддрд╛ рд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВред
  • Q8 рд╡реЗрд░рд┐рдПрдВрдЯ: рдпрд╣ рдХреНрд╡рд╛рдВрдЯрд╛рдЗрдЬрд╝реЗрд╢рди рдореЗрдореЛрд░реА рдмрдЪрдд рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдХреНрд╡рд╛рд▓рд┐рдЯреА рдХреЗ рдмреАрдЪ рд╕рдВрддреБрд▓рди рдмрдирд╛рддрд╛ рд╣реИтАФрдлреЛрди рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣рд▓реНрдХрд╛ рд░рд╣рддреЗ рд╣реБрдП рднреА рдирд┐рд░реНрджреЗрд╢-рдЕрдиреБрд╕рд░рдг рдХреЛ рдЕрдЪреНрдЫреЗ рд╕реЗ рд╣реИрдВрдбрд▓ рдХрд░рддрд╛ рд╣реИред
  • рдЯрд╛рд╕реНрдХ рдореЗрдЯрд╛рдбреЗрдЯрд╛: рдпрд╣ рд╡рд┐рд╡рд░рдг, рдбрд╛рдХреНрдпреВрдореЗрдВрдЯреЗрд╢рди URL рдФрд░ рд╕реЛрд░реНрд╕ рдХреЛрдб рд▓рд┐рдВрдХ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ Gallery рдРрдк рдореЗрдВ рдЯрд╛рд╕реНрдХ рдХреЛ рд╕рдордЭрдирд╛ рдФрд░ рдореЗрдВрдЯреЗрди рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрддрд╛ рд╣реИред
  • рдЯрд╛рд╕реНрдХ рд╕реВрдЪреА: рдЕрдВрддрддрдГ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдореЙрдбрд▓ рдЯрд╛рд╕реНрдХ рд╕реВрдЪреА рдореЗрдВ TASK_GEMMA_3_270M рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╣рдЪрд╛рдирд╛ рдЬрд╛рдПред

рдЪрд░рдг 3: рдореЙрдбрд▓ рдкреЙрдкреБрд▓реЗрд╢рди рдлрд╝рд┐рдХреНрд╕

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, Gallery рдРрдк рдЕрдкрдиреЗ рдореЙрдбрд▓ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЛ рдПрдХ рд░рд┐рдореЛрдЯ рдЕрд▓рд╛рдЙрд▓рд┐рд╕реНрдЯ JSON рд╕реЗ рдкреЙрдкреБрд▓реЗрдЯ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХрд╛ рдХрд╕реНрдЯрдо Gemma 3 270M рдПрдВрдЯреНрд░реА рд╡рд╣рд╛рдБ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ UI рдореЗрдВ рдирд╣реАрдВ рджрд┐рдЦреЗрдЧрд╛, рднрд▓реЗ рд╣реА рдЖрдкрдиреЗ рдХреЛрдб рдореЗрдВ TASK_GEMMA_3_270M рдЬреЛрдбрд╝ рджрд┐рдпрд╛ рд╣реЛред рдпрд╣ рдЪрд░рдг рдЕрд▓рд╛рдЙрд▓рд┐рд╕реНрдЯ рд▓реЛрдб рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдЖрдкрдХреЗ 270M рдореЙрдбрд▓ рдХреЛ LLM Prompt Lab рдЯрд╛рд╕реНрдХ рдореЗрдВ рдЧреНрд░рд╛рдлрд╝реНрдЯ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдпрд╣ рд╣рд░ рдмрд╛рд░ рдЪрдпрди рдпреЛрдЧреНрдп рд░рд╣реЗред

modelmanager/ModelManagerViewModel.kt рдЦреЛрд▓реЗрдВ, loadModelAllowlist() рдлрд╝рдВрдХреНрд╢рди рдЦреЛрдЬреЗрдВ, рдФрд░ (рдЕрд▓рд╛рдЙрд▓рд┐рд╕реНрдЯреЗрдб рдореЙрдбрд▓реЛрдВ рдХреЛ рдХрдиреНрд╡рд░реНрдЯ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реВрдк рдХреЗ рдмрд╛рдж) рдпрд╣ рдЬреЛрдбрд╝реЗрдВ:

Log.d(TAG, "Adding TASK_GEMMA_3_270M models to LLM_PROMPT_LAB")
            for (gemmaModel in TASK_GEMMA_3_270M.models) {
              if (!TASK_LLM_PROMPT_LAB.models.any { it.name == gemmaModel.name }) {
                Log.d(TAG, "Adding model ${gemmaModel.name} to LLM_PROMPT_LAB")
                TASK_LLM_PROMPT_LAB.models.add(gemmaModel)
              }

рдпрд╣ рдХреЛрдб рдЖрд╡рд╢реНрдпрдХ рдХреНрдпреЛрдВ рд╣реИ, рдЗрд╕рдХреЗ рдХрд╛рд░рдг:

  • рдЕрд▓рд╛рдЙрд▓рд┐рд╕реНрдЯ рд░реАрд╕реЗрдЯ: рдРрдк рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдкрд░ рд╕рд░реНрд╡рд░ рдЕрд▓рд╛рдЙрд▓рд┐рд╕реНрдЯ рд╕реЗ TASK_LLM_PROMPT_LAB.models рдХреЛ рдХреНрд▓рд┐рдпрд░ рдХрд░рдХреЗ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рддрд╛ рд╣реИред рдЬрдм рддрдХ рдЖрдк рдЕрдкрдиреЗ рд▓реЛрдХрд▓ рдореЙрдбрд▓ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЗрдВрдЬреЗрдХреНрдЯ рдирд╣реАрдВ рдХрд░рддреЗ, рд╡рд╣ рдорд┐рдЯ рдЬрд╛рдПрдЧрд╛ред
  • рдЖрдЗрдбреЗрдореНрдкреЛрдЯреЗрдВрдЯ рдФрд░ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ-рд╕реБрд░рдХреНрд╖рд┐рдд: рдЧрд╛рд░реНрдб any { it.name == gemmaModel.name } рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЬрдм loadModelAllowlist() рдлрд╝рдВрдХреНрд╢рди рдлрд┐рд░ рд╕реЗ рдЪрд▓рддрд╛ рд╣реИ, рддреЛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рди рд╣реЛрдВред
  • рдСрдлрд╝рд▓рд╛рдЗрди-рдлреНрд░реЗрдВрдбрд▓реА: рдпрд╣ рдХреЛрдб рддрдм рднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рдЕрд▓рд╛рдЙрд▓рд┐рд╕реНрдЯ рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ рдпрд╛ рдбрд┐рд╕реНрдХ рдлреЙрд▓рдмреИрдХ рд╕реЗ рд▓реЛрдб рд╣реЛрддреА рд╣реИтАФрджреЛрдиреЛрдВ рд╣реА рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдореЙрдбрд▓ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред

рдкреВрд░реА рдлрд╝рдВрдХреНрд╢рди рдпрд╣рд╛рдБ рд╣реИ:

fun loadModelAllowlist() {
    _uiState.update {
      uiState.value.copy(
        loadingModelAllowlist = true, loadingModelAllowlistError = ""
      )
    }
    viewModelScope.launch(Dispatchers.IO) {
      try {
        withTimeoutOrNull(30000L) { // 30 second timeout
          // Load model allowlist json.
          Log.d(TAG, "Loading model allowlist from internet...")
          val data = getJsonResponse<ModelAllowlist>(url = MODEL_ALLOWLIST_URL)
          var modelAllowlist: ModelAllowlist? = data?.jsonObj
          if (modelAllowlist == null) {
            Log.d(TAG, "Failed to load model allowlist from internet. Trying to load it from disk")
            modelAllowlist = readModelAllowlistFromDisk()
          } else {
            Log.d(TAG, "Done: loading model allowlist from internet")
            saveModelAllowlistToDisk(modelAllowlistContent = data?.textContent ?: "{}")
          }
          if (modelAllowlist == null) {
            Log.e(TAG, "Failed to load model allowlist from both internet and disk")
            _uiState.update { 
              uiState.value.copy(
                loadingModelAllowlist = false,
                loadingModelAllowlistError = "Failed to load model list"
              ) 
            }
            return@withTimeoutOrNull
          }
          Log.d(TAG, "Allowlist: $modelAllowlist")
          // Convert models in the allowlist.
          TASK_LLM_CHAT.models.clear()
          TASK_LLM_PROMPT_LAB.models.clear()
          TASK_LLM_ASK_IMAGE.models.clear()          
          try {
            for (allowedModel in modelAllowlist.models) {
              if (allowedModel.disabled == true) {
                continue
              }
              val model = allowedModel.toModel()
              if (allowedModel.taskTypes.contains(TASK_LLM_CHAT.type.id)) {
                TASK_LLM_CHAT.models.add(model)
              }
              if (allowedModel.taskTypes.contains(TASK_LLM_PROMPT_LAB.type.id)) {
                TASK_LLM_PROMPT_LAB.models.add(model)
              }
              if (allowedModel.taskTypes.contains(TASK_LLM_ASK_IMAGE.type.id)) {
                TASK_LLM_ASK_IMAGE.models.add(model)
              }
            }
            // Add models from TASK_GEMMA_3_270M to LLM_PROMPT_LAB
            Log.d(TAG, "Adding TASK_GEMMA_3_270M models to LLM_PROMPT_LAB")
            for (gemmaModel in TASK_GEMMA_3_270M.models) {
              if (!TASK_LLM_PROMPT_LAB.models.any { it.name == gemmaModel.name }) {
                Log.d(TAG, "Adding model ${gemmaModel.name} to LLM_PROMPT_LAB")
                TASK_LLM_PROMPT_LAB.models.add(gemmaModel)
              }
            }
          } catch (e: Exception) {
            Log.e(TAG, "Error processing model allowlist", e)
          }
          // Pre-process all tasks.
          try {
            processTasks()
          } catch (e: Exception) {
            Log.e(TAG, "Error processing tasks", e)
          }
          // Update UI state.
          val newUiState = createUiState()
          _uiState.update {
            newUiState.copy(
              loadingModelAllowlist = false,
            )
          }
          // Process pending downloads.
          try {
            processPendingDownloads()
          } catch (e: Exception) {
            Log.e(TAG, "Error processing pending downloads", e)
          }
        } ?: run {
          // Timeout occurred
          Log.e(TAG, "Model allowlist loading timed out")
          _uiState.update { 
            uiState.value.copy(
              loadingModelAllowlist = false,
              loadingModelAllowlistError = "Model list loading timed out"
            ) 
          }
        }
      } catch (e: Exception) {
        Log.e(TAG, "Error in loadModelAllowlist", e)
        _uiState.update { 
          uiState.value.copy(
            loadingModelAllowlist = false,
            loadingModelAllowlistError = "Failed to load model list: ${e.message}"
          ) 
        }
      }
    }
  }

рдЪрд░рдг 4: рдиреЗрд╡рд┐рдЧреЗрд╢рди рд▓реЙрдЬрд┐рдХ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ

рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдРрдк рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЪреБрдирд╛ рдЧрдпрд╛ рдЯрд╛рд╕реНрдХ рдХреНрд▓рд┐рдХ рдХрд┐рдП рдЧрдП рдореЙрдбрд▓ рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред рдПрдХ рдмрд╛рд░ рдЬрдм рдЖрдк Gemma 3 270M рдХреЛ Prompt Lab рдЯрд╛рд╕реНрдХ (рдЪрд░рдг 3) рдореЗрдВ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдорд╛рдиреНрдпрддрд╛ рдЯреВрдЯ рд╕рдХрддреА рд╣реИред рдпрд╣ рдЪрд░рдг рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ рдореЙрдбрд▓-рдЕрд╡реЗрдпрд░ рдмрдирд╛рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдЯреИрдкреНрд╕, рдбреАрдк рд▓рд┐рдВрдХреНрд╕, рдФрд░ рд░рд┐рд╕реНрдЯреЛрд░реНрдб рд╕реНрдЯреЗрдЯ рд╣рдореЗрд╢рд╛ рд╕рд╣реА рд╕реНрдХреНрд░реАрди рдкрд░ рдЬрд╛рдПрдБред

navigation/GalleryNavGraph.kt рдЦреЛрд▓реЗрдВ рдФрд░ рдореЙрдбрд▓ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХрдВрдЯреНрд░реЛрд▓ рд▓реЙрдЬрд┐рдХ рдХреЛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ:

рдкрд╣рд▓реЗ:

onModelClicked = { model ->
  navigateToTaskScreen(
    navController = navController, taskType = curPickedTask.type, model = model
  )
}

рдмрд╛рдж рдореЗрдВ:

onModelClicked = { model ->
  Log.d("GalleryNavGraph", "Model clicked: ${model.name}, current task: ${curPickedTask.type}")
  val actualTask = when {
    TASK_LLM_CHAT.models.any { it.name == model.name } -> TASK_LLM_CHAT
    TASK_LLM_PROMPT_LAB.models.any { it.name == model.name } -> TASK_LLM_PROMPT_LAB
    TASK_LLM_ASK_IMAGE.models.any { it.name == model.name } -> TASK_LLM_ASK_IMAGE
    TASK_TEXT_CLASSIFICATION.models.any { it.name == model.name } -> TASK_TEXT_CLASSIFICATION
    TASK_IMAGE_CLASSIFICATION.models.any { it.name == model.name } -> TASK_IMAGE_CLASSIFICATION
    TASK_IMAGE_GENERATION.models.any { it.name == model.name } -> TASK_IMAGE_GENERATION
    else -> curPickedTask
  }
  Log.d("GalleryNavGraph", "Navigating to task: ${actualTask.type} for model: ${model.name}")
  navigateToTaskScreen(
    navController = navController, taskType = actualTask.type, model = model
  )
}

рдпрджрд┐ рдХреЛрдИ рдореЙрдбрд▓ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЪрдпрдирд┐рдд рдЯрд╛рд╕реНрдХ рд╕реЗ рднрд┐рдиреНрди рдЯрд╛рд╕реНрдХ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ (рдпрд╛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ), рддреЛ рдпрд╣ рдХреЛрдб рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕реНрдХреНрд░реАрди рдореЙрдбрд▓ рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рд╕реЗ рдореЗрд▓ рдЦрд╛рдПред┬а

рдбреАрдк рд▓рд┐рдВрдХреНрд╕ рдпрд╛ рд░рд┐рд╕реНрдЯреЛрд░реНрдб рд╕реНрдЯреЗрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рдРрдк рдХрд┐рд╕реА рдРрд╕реЗ рдореЙрдбрд▓ рдХреЛ рдЦреЛрд▓рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЕрдм рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИред рдЙрдЪрд┐рдд рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЗ рдмрд┐рдирд╛, рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдЦрд╛рд▓реА рд╕реНрдХреНрд░реАрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕реЗ рдЯрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╕реЗрдлрд╝реНрдЯреА рдЪреЗрдХ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВтАФрдпрджрд┐ рдореЙрдбрд▓ рдЧрд╛рдпрдм рд╣реИ, рддреЛ рд╣рдо рдЪреЗрддрд╛рд╡рдиреА рд▓реЙрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВред рдРрд╕реЗ рдХрд░реЗрдВ:

// Added error handling for model not found:
if (model != null) {
  Log.d("GalleryNavGraph", "Model found for LlmChat: ${model.name}")
  modelManagerViewModel.selectModel(model)
  LlmChatScreen(/* ... */)
} else {
  Log.w("GalleryNavGraph", "Model not found for LlmChat, modelName: ${it.arguments?.getString("modelName")}")
  // Handle case where model is not found
  androidx.compose.runtime.LaunchedEffect(Unit) {
    navController.navigateUp()
  }
}

рдпрд╣ рдХреЛрдб рдРрдк рдХреЛ рдХрд╛рд░реНрдпрд╢реАрд▓ рдмрдирд╛рдП рд░рдЦрддрд╛ рд╣реИред рдлрд╝реНрд░реАрдЬрд╝ рд╣реЛрдиреЗ рдпрд╛ рдЦрд╛рд▓реА рд╕реНрдХреНрд░реАрди рджрд┐рдЦрд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдпрд╣ navController рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд╡рд╛рдкрд╕ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рддрд░рд╣, рднрд▓реЗ рд╣реА рдХреЛрдИ рдореЙрдбрд▓ рдЧрд╛рдпрдм рд╣реЛ, рд╕рдордЧреНрд░ рдЕрдиреБрднрд╡ рдмрд╛рдзрд┐рдд рд╣реБрдП рдмрд┐рдирд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рд╡рд╛рд╣ рд╕реБрдЪрд╛рд░реВ рд░реВрдк рд╕реЗ рдЬрд╛рд░реА рд░рд╣рддрд╛ рд╣реИред

рдЪрд░рдг 5: рд╕реБрд░рдХреНрд╖рд╛ рдФрд░ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛┬а

рдореЛрдмрд╛рдЗрд▓ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдмрдбрд╝рд╛ рднрд╛рд╖рд╛ рдореЙрдбрд▓ рдЪрд▓рд╛рдирд╛ рдбреЗрд╕реНрдХрдЯреЙрдк рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдЪрд▓рд╛рдиреЗ рд╕реЗ рднрд┐рдиреНрди рд╣реИред рд╕реНрдЯреЛрд░реЗрдЬ рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдореЗрдореЛрд░реА рдмрдЬрдЯ рдЕрдзрд┐рдХ рдХрдбрд╝реЗ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдлрд╝реЗрд▓реНрдпрд░реНрд╕ рдХреЛ рдРрдк рдХреНрд░реИрд╢ рд╕реЗ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрднрд╛рд▓рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред Android рдкрд░ Gemma 3 270M (Q8, ~304MB) рдХреЛ рд╕реНрдерд┐рд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рд╕реЗрдлрд╝реНрдЯреА рдЪреЗрдХреНрд╕ рдФрд░ рдлрд╝реЗрд▓рдУрд╡рд░ рд╕реНрдЯреНрд░реИрдЯреЗрдЬреАрдЬрд╝ рдЬреЛрдбрд╝реАрдВред

рдЪрд░рдг 5.1: рд╕рд╣рд┐рд╖реНрдгреБ рд╕рд╛рдЗрдЬрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓ рд╡реИрд▓рд┐рдбреЗрд╢рди

рдореЙрдбрд▓ рд▓реЛрдб рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдРрдк .task рдлрд╝рд╛рдЗрд▓ рдкрд░ рд╕реЗрдиреАрдЯреА рдЪреЗрдХреНрд╕ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдореЙрдбрд▓ рдлрд╝рд╛рдЗрд▓ рдореМрдЬреВрдж рд╣реИ, рдкрдврд╝рдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рдФрд░ рдЕрдкреЗрдХреНрд╖рд┐рдд рдЖрдХрд╛рд░ рдХреЗ рдХрд╛рдлрд╝реА рдХрд░реАрдм рд╣реИ (┬▒10% рдХреЗ рднреАрддрд░)ред рдпрд╣ рдЯреЙрд▓рд░реЗрдВрд╕ рдХрдВрдкреНрд░реЗрд╢рди рдпрд╛ рдкреИрдХреЗрдЬрд┐рдВрдЧ рдХреЗ рдХрд╛рд░рдг рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдЫреЛрдЯреЗ рдЕрдВрддрд░ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдХрд░рдкреНрдЯ рдпрд╛ рдЖрдВрд╢рд┐рдХ рдбрд╛рдЙрдирд▓реЛрдб рдХреЛ рдкрдХрдбрд╝рддрд╛ рд╣реИред

// File validation and logging
Log.d(TAG, "Checking model file: $modelPath")
Log.d(TAG, "Model file exists: ${modelFile.exists()}")
Log.d(TAG, "Model file can read: ${modelFile.canRead()}")
Log.d(TAG, "Model file size: ${modelFile.length()} bytes")
Log.d(TAG, "Model file absolute path: ${modelFile.absolutePath}")
// Size validation with tolerance (10%)
val expectedSize = model.sizeInBytes
val fileSize = modelFile.length()
val sizeDifference = kotlin.math.abs(fileSize - expectedSize)
val sizeTolerance = (expectedSize * 0.1).toLong()
if (!modelFile.exists() || !modelFile.canRead() || sizeDifference > sizeTolerance) {
  onDone("Model file invalid (missing/unreadable/wrong size).")
  return
}

рдпрд╣ рд╕реНрдирд┐рдкреЗрдЯ рдореЙрдбрд▓ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╡реИрд▓рд┐рдбреЗрдЯ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдкрде, рд░реАрдбреЗрдмрд┐рд▓рд┐рдЯреА рдФрд░ рд╕рд╛рдЗрдЬ рдЬреИрд╕реА рдореВрд▓ рдмрд╛рддреЗрдВ рд▓реЙрдЧ рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ рдЬрд╛рдБрдЪрддрд╛ рд╣реИ рдХрд┐ рдлрд╝рд╛рдЗрд▓ рдореМрдЬреВрдж рд╣реИ, рдкрдврд╝рдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдФрд░ рдЕрдкреЗрдХреНрд╖рд┐рдд рдЖрдХрд╛рд░ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред рдпрджрд┐ рдЗрдирдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдЬрд╛рдБрдЪ рд╡рд┐рдлрд▓ рд╣реЛрддреА рд╣реИ, рддреЛ рдлрд╝рдВрдХреНрд╢рди onDone() рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд▓реНрджреА рдмрдВрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдЗрдиреНрдлрд░реЗрдВрд╕ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рдХреЗ рдХреНрд░реИрд╢ рдХрд╛ рдЬреЛрдЦрд┐рдо рди рд░рд╣реЗред

рдЪрд░рдг 5.2: рдореЗрдореЛрд░реА-рдЕрд╡реЗрдпрд░ рдмреИрдХрдПрдВрдб рдЪрдпрди┬а

рдпрджрд┐ рдЖрдк рдЖрдХреНрд░рд╛рдордХ рд░реВрдк рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ (рд▓рдВрдмреЗ рдЖрдЙрдЯрдкреБрдЯ, GPU рдПрд▓реЛрдХреЗрд╢рди рд╕реНрдкрд╛рдЗрдХреНрд╕), рддреЛ рдмрдбрд╝реЗ рдореЙрдбрд▓ Out-Of-Memory (OOM) рддреНрд░реБрдЯрд┐рдпрд╛рдБ рджреЗ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕реЗ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдлрд╝рд╛рдЗрд▓ рдЖрдХрд╛рд░ рдФрд░ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рдмрд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдмреИрдХрдПрдВрдб (CPU рдмрдирд╛рдо GPU/NPU) рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЙрдЬрд┐рдХ рдЬреЛрдбрд╝рд╛, рд╕рд╛рде рд╣реА рдУрд╡рд░рд╕рд╛рдЗрдЬрд╝реНрдб рдмрд╛рдЗрдирд░реА рдХреЗ рд▓рд┐рдП рдореИрдХреНрд╕ рдЯреЛрдХрдиреНрд╕ рдХреЛ рдЯреНрд░рд┐рдо рдХрд┐рдпрд╛ред

val preferredBackend = when {
  fileSize > 200_000_000L -> {
    Log.d(TAG, "Model is large (${fileSize / 1024 / 1024}MB), using CPU backend for safety")
    LlmInference.Backend.CPU
  }
  accelerator == Accelerator.CPU.label -> LlmInference.Backend.CPU
  accelerator == Accelerator.GPU.label -> LlmInference.Backend.GPU
  else -> LlmInference.Backend.CPU
}
val baseMaxTokens = 1024 // your default; tune to taste
val maxTokens = if (fileSize > 200_000_000L) {
  kotlin.math.min(baseMaxTokens, 512)
} else {
  baseMaxTokens
}

рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдмрдбрд╝реЗ рдореЙрдбрд▓ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ CPU рдкрд░ рдЬрд╛рдПрдБ (рдЬрд╝реНрдпрд╛рджрд╛ рд╕реБрд░рдХреНрд╖рд┐рдд, рдкрд░ рдзреАрдореЗ)ред рдХреЛрдб .task рдлрд╝рд╛рдЗрд▓ рдХреЗ рдмрд╛рдЗрдЯ рдЖрдХрд╛рд░ (fileSize) рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрд╕реЗ рдПрдХ рдереНрд░реЗрд╢рд╣реЛрд▓реНрдб (maxTokens) рд╕реЗ рддреБрд▓рдирд╛ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдпрд╣ 200 MB рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рддреЛ рдпрд╣ рдЗрдиреНрдлрд░реЗрдВрд╕ рдХреЛ CPU рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЯреЛрдХрди рдмрдЬрдЯ рдЖрдзрд╛ рдХрд░ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдПрдХ рд╕рд╛рде рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ GPU рдПрд▓реЛрдХреЗрд╢рди рд╕реЗ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдореЗрдореЛрд░реА рд╕реНрдкрд╛рдЗрдХреНрд╕ рдФрд░ рдУрд╡рд░рд╕рд╛рдЗрдЬрд╝реНрдб рдЬреЗрдирд░реЗрд╢рди рд░рд┐рдХреНрд╡реЗрд╕реНрдЯреНрд╕ рд╕реЗ рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

рдЪрд░рдг 5.3: рдПрдХреНрд╕реЗрдкреНрд╢рди рд╣реИрдВрдбрд▓рд┐рдВрдЧ

LiteRT рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╕рдордп рд░рдирдЯрд╛рдЗрдо рдХреНрд░рд┐рдПрд╢рди рдФрд░ рд╕реЗрд╢рди рдХреНрд░рд┐рдПрд╢рди рдореЗрдВ рдЕрдВрддрд░ рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдпрджрд┐ рд╕реЗрд╢рди рдХреНрд░рд┐рдПрд╢рди рд╡рд┐рдлрд▓ рд╣реЛрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЖрдк рд░рдирдЯрд╛рдЗрдо рдЦреБрд▓рд╛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╕рдВрд╕рд╛рдзрди рд▓реАрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдореЗрдореЛрд░реА рд▓реЙрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдХреНрд░рдорд┐рдХ рд╡рд┐рдлрд▓рддрд╛рдПрдБ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдЗрд╕реЗ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдХреЛрдб рдХреЛ try/catch рдмреНрд▓реЙрдХреНрд╕ рдореЗрдВ рд░реИрдк рдХрд┐рдпрд╛ рдФрд░ рд╕реНрдкрд╖реНрдЯ рдХреНрд▓реАрдирдЕрдк рдЬреЛрдбрд╝рд╛ред

val llmInference = try {
  LlmInference.createFromOptions(context, options)
} catch (e: Exception) {
  Log.e(TAG, "Failed to create LlmInference instance", e)
  onDone("Failed to create model instance: ${e.message}")
  return
}
val session = try {
  LlmInferenceSession.createFromOptions(/* ... */)
} catch (e: Exception) {
  Log.e(TAG, "Failed to create LlmInferenceSession", e)
  try {
    llmInference.close()
  } catch (closeException: Exception) {
    Log.e(TAG, "Failed to close LlmInference after session creation failure", closeException)
  }
  onDone("Failed to create model session: ${e.message}")
  return
}

рдпрд╣ try/catch рд╕реНрд╡рдЪреНрдЫ рд░реЛрд▓рдмреИрдХ рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИтАФрдпрджрд┐ рд░рдирдЯрд╛рдЗрдо рдХреНрд░рд┐рдПрд╢рди рдЕрд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЖрдЧреЗ рдХреБрдЫ рдирд╣реАрдВ рдмрдврд╝рддрд╛; рд▓реЗрдХрд┐рди рдпрджрд┐ рд╕реЗрд╢рди рдХреНрд░рд┐рдПрд╢рди рдЕрд╕рдлрд▓ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд░рдирдЯрд╛рдЗрдо рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╣реАрдк-рдПрд▓реЛрдХреЗрдЯреЗрдб llmInference рдСрдмреНрдЬреЗрдХреНрдЯ .close() рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдбрд┐рд╕реНрдкреЛрдЬрд╝ рд╣реЛ, рдЬрд┐рд╕рд╕реЗ рдореЗрдореЛрд░реА рдФрд░ рдлрд╝рд╛рдЗрд▓ рд╣реИрдВрдбрд▓реНрд╕ рд░рд┐рд▓реАрдЬрд╝ рд╣реЛ рдЬрд╛рдПрдБред рдЕрдиреНрдпрдерд╛, рдЖрдк JNI рд░реЗрдлрд╝рд░реЗрдВрд╕реЗрдЬрд╝ рдХреЗ рдЬреЛрдЦрд┐рдо рдореЗрдВ рд░рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдЕрдЧрд▓реЗ рдореЙрдбрд▓ рд▓реЛрдб рдкрд░ рдХреНрд░реИрд╢ рдХрд░рд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдЪрд░рдг 5.4: рдЗрдиреНрдлрд░реЗрдВрд╕-рдЯрд╛рдЗрдо рдЧрд╛рд░реНрдбреНрд╕

рднрд▓реЗ рд╣реА рдХреЛрдИ рдореЙрдбрд▓ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд▓реЛрдб рд╣реЛ рдЬрд╛рдП, рдЗрдиреНрдлрд░реЗрдВрд╕ рд░реЗрд╕ рдХрдВрдбреАрд╢рдиреНрд╕, рдирд▓ рд░реЗрдлрд╝рд░реЗрдВрд╕реЗрдЬрд╝, рдпрд╛ рдЕрдирдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реНрдб рдЗрдВрд╕реНрдЯреИрдВрд╕реЗрдЬрд╝ рдХреЗ рдХрд╛рд░рдг рд╡рд┐рдлрд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕реЗ рд╕рдЦрд╝реНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдкреВрд░реЗ рдЗрдиреНрдлрд░реЗрдВрд╕ рдмреНрд▓реЙрдХ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдирд▓ рдЪреЗрдХреНрд╕ рдФрд░ рдПрдХреНрд╕реЗрдкреНрд╢рди рдХреИрдЪ рдЬреЛрдбрд╝реЗред

try {
  Log.d(TAG, "Starting inference for model '${model.name}' with input: '${input.take(50)}...'")
  val instance = model.instance as LlmModelInstance? ?: run {
    Log.e(TAG, "Model instance is null for '${model.name}'")
    resultListener("Error: Model not initialized", true)
    return
  }
} catch (e: Exception) {
  Log.e(TAG, "Error during inference for model '${model.name}'", e)
  resultListener("Error during inference: ${e.message}", true)
}

рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЗрдиреНрдлрд░реЗрдВрд╕ рдХреЗрд╡рд▓ рд╡реИрдз рдореЙрдбрд▓ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЗ рд╕рд╛рде рд╣реА рдЖрдЧреЗ рдмрдврд╝реЗ, рдФрд░ рд░рдирдЯрд╛рдЗрдо рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рд╛рдлрд╝-рд╕реБрдерд░реЗ рдврдВрдЧ рд╕реЗ рдХреИрдЪ рдХрд░реЗред as LlmModelInstance? рдХрд╛рд╕реНрдЯ рдЬрд╛рдБрдЪрддрд╛ рд╣реИ рдХрд┐ рдореЙрдбрд▓ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рд╕рд╣реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдФрд░ рдПрд▓реНрд╡рд┐рд╕-рдЬреИрд╕рд╛ рдлреЙрд▓рдмреИрдХ рдпрджрд┐ рдирд▓ рд╣реЛ рддреЛ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рддреБрд░рдВрдд рд░реЛрдХ рджреЗрддрд╛ рд╣реИред try/catch рдореЗрдВ рдмреНрд▓реЙрдХ рд▓рдкреЗрдЯрдиреЗ рд╕реЗ рдХреЛрдИ рднреА рдПрдХреНрд╕реЗрдкреНрд╢рди рдкрдХрдбрд╝ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реЗ рдПрд░рд░ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЪрд░рдг 6: рдЕрдкрдиреЗ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдРрдк рдЗрдВрд╕реНрдЯреЙрд▓ рдФрд░ рд░рди рдХрд░реЗрдВ

рдЬрдм рдЖрдк рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдмрджрд▓рд╛рд╡ рдХрд░ рд▓реЗрдВ, рддреЛ рд╣рдо рдРрдк рдЪрд▓рд╛рдПрдБрдЧреЗред рдЕрдкрдиреЗ рд▓реЛрдХрд▓ Android рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдРрдк рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рдореНрди рдЪрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде Android Studio рдореЗрдВ рд╡рд╛рдпрд░рд▓реЗрд╕ рдбрд┐рдмрдЧрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдкреЗрдпрд░ рдХрд░реЗрдВред

рдЪрд░рдг 6.1: Android рдбрд┐рд╡рд╛рдЗрд╕ рд╕реЗрдЯ рдЕрдк рдХрд░реЗрдВ

рдЕрдкрдиреЗ Android рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ Settings рдРрдк рдореЗрдВ рдЬрд╛рдПрдБ рдФрд░ Developer options рд╕рдХреНрд╖рдо рдХрд░реЗрдВред рдлрд┐рд░ Wireless debugging рдЪрд╛рд▓реВ рдХрд░реЗрдВред рдЖрдкрдХреЛ рджреЛ рдкреЗрдпрд░рд┐рдВрдЧ рд╡рд┐рдХрд▓реНрдкреЛрдВ рд╡рд╛рд▓реА рд╕реНрдХреНрд░реАрди рджрд┐рдЦрдиреА рдЪрд╛рд╣рд┐рдПред

Gemma 3 270M рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП Android рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рд╡рд╛рдпрд░рд▓реЗрд╕ рдбрд┐рдмрдЧрд┐рдВрдЧ рд╕реЗрдЯрд┐рдВрдЧреНрд╕

рдЪрд░рдг 6.2: Android Studio рдореЗрдВ рдбрд┐рд╡рд╛рдЗрд╕ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░реЗрдВ

Android Studio рдореЗрдВ Device Manager рдЦреЛрд▓реЗрдВ (рдЖрдЗрдХрди рдкрд░ Android рд▓реЛрдЧреЛ рд╡рд╛рд▓рд╛ рдлрд╝реЛрди рджрд┐рдЦрддрд╛ рд╣реИ) рдФрд░ Pair using QR code рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред

WiFi рд╕реЗ рдирдпрд╛ рдбрд┐рд╡рд╛рдЗрд╕ рдкреЗрдпрд░ рдХрд░реЗрдВ

рдЕрдкрдиреЗ рдбрд┐рд╡рд╛рдЗрд╕ рд╕реЗ QR рдХреЛрдб рд╕реНрдХреИрди рдХрд░реЗрдВ рдФрд░ рдкреЗрдпрд░рд┐рдВрдЧ рд╕реЗрдЯрдЕрдк рдкреВрд░рд╛ рдХрд░реЗрдВред рдПрдХ рдмрд╛рд░ рдбрд┐рд╡рд╛рдЗрд╕ рдХрдиреЗрдХреНрдЯ рд╣реЛрдиреЗ рдкрд░, Device Manager рдХреЗ рдЕрдВрддрд░реНрдЧрдд рдЖрдкрдХрд╛ рдбрд┐рд╡рд╛рдЗрд╕ рдирд╛рдо рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХрд╛ рд╕рд┐рд╕реНрдЯрдо рдФрд░ Android рдбрд┐рд╡рд╛рдЗрд╕ рджреЛрдиреЛрдВ рдПрдХ рд╣реА WiFi рдиреЗрдЯрд╡рд░реНрдХ рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реЛрдВред

Device Manager

рдЪрд░рдг 6.3: рдРрдк рдЪрд▓рд╛рдПрдБ

Android рдбрд┐рд╡рд╛рдЗрд╕ рдорд┐рд░рд░рд┐рдВрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Device Mirroring рдЖрдЗрдХрди (рдЬрд┐рд╕рдореЗрдВ рдбреЗрд╕реНрдХрдЯреЙрдк рд╕реНрдХреНрд░реАрди рдФрд░ рдлрд╝реЛрди рд╕реНрдХреНрд░реАрди рджрд┐рдЦрддреА рд╣реИ) рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред рдЬреИрд╕реЗ рд╣реА рдЖрдкрдХрд╛ рдбрд┐рд╡рд╛рдЗрд╕ рд╕реНрдХреНрд░реАрди рдорд┐рд░рд░ рд╣реЛ рдЬрд╛рдП, рд╣рд░реЗ Run рдЖрдЗрдХрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдРрдк рдЖрдкрдХреЗ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдбрд┐рдкреНрд▓реЙрдп рд╣реЛ рдЬрд╛рдПред

рдЪрд░рдг 6.4: рдореЙрдбрд▓реЛрдВ рдХреЛ рдСрди-рдбрд┐рд╡рд╛рдЗрд╕ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ

рдРрдк рд▓реЙрдиреНрдЪ рд╣реЛрдЧрд╛, рдФрд░ рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╡рд┐рдВрдбреЛ рдЦреБрд▓реЗрдЧреА рдЬреЛ рдЖрдкрдХреЛ рдореЙрдбрд▓ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП write рдЯреЛрдХрди рдХреЗ рд╕рд╛рде Hugging Face рдореЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд░реЗрдЧреАред

HuggingFace рдореЗрдВ рд▓реЙрдЧ рдЗрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЪрдпрдирд┐рдд рдореЙрдбрд▓ рдкрд░ start download рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ, рдФрд░ рдЖрдкрдХрд╛ рдореЙрдбрд▓ рдбрд╛рдЙрдирд▓реЛрдб рд╣реЛрдирд╛ рд╢реБрд░реВ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ gemma3-270m-it-q8 рдореЙрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБред рдЕрдм рдЖрдк рдЗрд╕ рдореЙрдбрд▓ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЪрд░рдг 7: рдкреНрд░рдпреЛрдЧ рд╢реБрд░реВ рдХрд░реЗрдВ

рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЪрд╛рд░ рдкреНрд░рдпреЛрдЧ рдЪрд▓рд╛рдП:

рдкреНрд░рдпреЛрдЧ 1: рдлреНрд░реА-рдлрд╝реЙрд░реНрдо рд▓реЗрдЦрди

рдЗрд╕ рдкреНрд░рдпреЛрдЧ рдореЗрдВ, рдореИрдВрдиреЗ рдореЙрдбрд▓ рдХреЛ рдПрдХ рдлреНрд░реА-рдлрд╝реЙрд░реНрдо рдХрд╣рд╛рдиреА рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЙрдореНрдкреНрдЯ рдХрд┐рдпрд╛, рдФрд░ рдпреЗ рдкрд░рд┐рдгрд╛рдо рд░рд╣реЗ:

рдореЙрдбрд▓ рд╕реНрдкрд╖реНрдЯ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рд╡рд┐рд╖рдп-рд╡рд╕реНрддреБ рдкрд░ рдЕрд╕рд░рджрд╛рд░ рдЯреЗрдХреНрд╕реНрдЯ рдмрдирд╛рддрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдБрдХрд┐ рдпрд╣ рдЕрдХреНрд╕рд░ рд╕реБрд░рдХреНрд╖рд┐рдд рдЦреЗрд▓рддрд╛ рд╣реИ рдФрд░ рдХреБрдЫ рд╣рдж рддрдХ рд╕рд╛рдорд╛рдиреНрдп-рд╕рд╛ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред рд▓рдВрдмреЗ рдЖрдЙрдЯрдкреБрдЯ рдкрд░, рдореЙрдбрд▓ рдЖрдорддреМрд░ рдкрд░ рдХреБрдЫ рд╡рд╛рдХреНрдпреЛрдВ рдХреЛ рджреЛрд╣рд░рд╛рддрд╛ рд╣реИред рдЗрд╕рд╕реЗ рдпрд╣ рдЫреЛрдЯреЗ рдкреЛрд╕реНрдЯреНрд╕, рд╡рд┐рд╡рд░рдгреЛрдВ рдФрд░ рдЖрдЙрдЯрд▓рд╛рдЗрди рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд рдмрдирддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдлрд░реНрд╕реНрдЯ-рдЯреЛрдХрди рдЬреЗрдирд░реЗрд╢рди рдХрд╝рд░реАрдм 0.53 рд╕реЗрдХрдВрдб рдореЗрдВ рдХрд╛рдлрд╝реА рддреЗрдЬрд╝ рд╣реИ, рдФрд░ рдСрди-рдбрд┐рд╡рд╛рдЗрд╕ рдЗрдиреНрдлрд░реЗрдВрд╕ рдХреЗ рд▓рд┐рдП рдбрд┐рдХреЛрдб рд╕реНрдкреАрдб рднреА рдЕрдЪреНрдЫреА рд╣реИред

рдкреНрд░рдпреЛрдЧ 2: рдЯреЛрди рд░реА-рд░рд╛рдЗрдЯ

рдЕрдЧрд▓реЗ рдЪрд░рдг рдореЗрдВ, рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд▓рд┐рдЦреЗ рдПрдХ рдкреИрд░рд╛рдЧреНрд░рд╛рдлрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдФрд░ Gemma 3 270M рд╕реЗ рдЙрд╕реЗ рдлреНрд░реЗрдВрдбрд▓реА рдЯреЛрди рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЛ рдХрд╣рд╛ред

рдкреНрд░рдпреЛрдЧ 2: рдЯреЛрди рд░реА-рд░рд╛рдЗрдЯ

рдЗрдВрд╕реНрдЯреНрд░рдХреНрд╢рди-рдлрд╝реЙрд▓реЛрдЗрдВрдЧ рдордЬрд╝рдмреВрдд рд╣реИтАФрдФрдкрдЪрд╛рд░рд┐рдХ, рдЕрдиреМрдкрдЪрд╛рд░рд┐рдХ рдФрд░ рдлреНрд░реЗрдВрдбрд▓реА рдЯреЛрди рдХреЗ рдмреАрдЪ рд╕реНрдкрд╖реНрдЯ рдмрджрд▓рд╛рд╡ рдХрд░рддреЗ рд╣реБрдП рднреА рдЕрд░реНрде рдмрд░рдХрд╝рд░рд╛рд░ рд░рд╣рддрд╛ рд╣реИред рдЫреЛрдЯреЗ рдкреИрд╕реЗрдЬ рдХреЗ рд▓рд┐рдП рдЧрддрд┐ рд▓рдЧрднрдЧ рддреНрд╡рд░рд┐рдд рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдИрдореЗрд▓ рдкреЙрд▓рд┐рд╢ рдХрд░рдиреЗ рдпрд╛ рд╢реИрд▓рд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдХрдиреНрд╡рд░реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЙрдкрдпреБрдХреНрдд рд╣реИред

рдкреНрд░рдпреЛрдЧ 3: рдЯреЗрдХреНрд╕реНрдЯ рдХрд╛ рд╕рд╛рд░

рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд▓рд┐рдЦреЗ рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдмреБрд▓реЗрдЯ рдкреЙрдЗрдВрдЯреНрд╕ рдореЗрдВ рд╕рдорд░реА рднреА рдХрд┐рдпрд╛ред рдЖрдк рд╕рдорд░реА, рдкреЙрдЗрдВрдЯреНрд╕, рдЯреЗрдХрдЕрд╡реЗ рдФрд░ рдЕрдиреНрдп рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдкреНрд░рдпреЛрдЧ 3: рдЯреЗрдХреНрд╕реНрдЯ рдХрд╛ рд╕рд╛рд░

рдЗрд╕ рдкреНрд░рдпреЛрдЧ рдореЗрдВ, рдореЙрдбрд▓ рд╕рдорд░реА рдХрд░рддрд╛ рд╣реИ рдФрд░ рдореБрдЦреНрдп рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдкрдХрдбрд╝рддрд╛ рд╣реИред рдЫреЛрдЯреЗ рдФрд░ рдордзреНрдпрдо рдЖрдХрд╛рд░ рдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдЧрддрд┐ рдЙрддреНрдХреГрд╖реНрдЯ рд╣реИред рдХреБрдЫ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдПрдЧреНрдЬрд╝реАрдХреНрдпреВрдЯрд┐рд╡ рд╕рдорд░реА, рдмреБрд▓реЗрдЯ рд╣рд╛рдЗрд▓рд╛рдЗрдЯреНрд╕ рдпрд╛ TL;DR рд╢рд╛рдорд┐рд▓ рд╣реИрдВред┬а

рдкреНрд░рдпреЛрдЧ 4: рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рд░рд╛рдЗрдЯрд░

рдЕрдВрдд рдореЗрдВ, рдореИрдВрдиреЗ рдореЙрдбрд▓ рд╕реЗ рдПрдХ рдЫреЛрдЯрд╛ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рд▓рд┐рдЦрдиреЗ рдХреЛ рдХрд╣рд╛ред рдпрд╣ рдкрд╛рдпрд╛:

рдкреНрд░рдпреЛрдЧ 4: рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рд░рд╛рдЗрдЯрд░

рдореЙрдбрд▓ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдФрд░ рдЫреЛрдЯреЗ рдпреВрдЯрд┐рд▓рд┐рдЯреАрдЬрд╝ рдЬреЗрдирд░реЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рдкреНрд░рднрд╛рд╡реА рд╣реИ, рд╣рд╛рд▓рд╛рдБрдХрд┐ рдпрд╣ рдЗрдореНрдкреЛрд░реНрдЯреНрд╕, рдПрдЬ рдХреЗрд╕, рдпрд╛ рдЬрдЯрд┐рд▓ рд▓реЙрдЬрд┐рдХ рдХреЛ рдЧрд╛рдЗрдбреЗрдВрд╕ рдХреЗ рдмрд┐рдирд╛ рдорд┐рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЫреЛрдЯреЗ рд╕реНрдирд┐рдкреЗрдЯреНрд╕ рддреЗрдЬрд╝реА рд╕реЗ рдмрдирддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рд▓рдВрдмреА рдХрдореНрдкреНрд▓реАрд╢рдиреНрд╕ рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рдмрдврд╝рдиреЗ рдкрд░ рдереЛрдбрд╝реА рдзреАрдореА рд╣реЛ рдЬрд╛рддреА рд╣реИрдВред рдпрд╣ рд╣реЗрд▓реНрдкрд░ рдлрд╝рдВрдХреНрд╢рдиреНрд╕ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧреНрд╕ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред┬а

рдпрджрд┐ рдЖрдк рдкреВрд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛрдб рдХреЛ рдПрдХреНрд╕рдкреНрд▓реЛрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдореИрдВрдиреЗ рдпрд╣ GitHub рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА рд╕реЗрдЯ рдЕрдк рдХрд░ рджреА рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖

рдЗрд╕ рдЧрд╛рдЗрдб рдореЗрдВ, рд╣рдордиреЗ рдЪрд░рдг-рджрд░-рдЪрд░рдг рджреЗрдЦрд╛ рдХрд┐ Gemma 3 270M рдореЙрдбрд▓ рдХреЛ рдХреИрд╕реЗ рдЪрд▓рд╛рдПрдБтАФрдореЙрдбрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдФрд░ рдЙрд╕реЗ рдХрд╕реНрдЯрдо Android рдРрдк рдореЗрдВ рд╡рд╛рдпрд░ рдХрд░рдиреЗ рд╕реЗ рд▓реЗрдХрд░ рдиреЗрд╡рд┐рдЧреЗрд╢рди, рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рдФрд░ рдЗрдиреНрдлрд░реЗрдВрд╕-рдЯрд╛рдЗрдо рд╕реЗрдлрд╝реНрдЯреА рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рддрдХред

Gemma 3 рддреЗрдЬрд╝ рдЗрдиреНрдлрд░реЗрдВрд╕, рдХрдо рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рдУрд╡рд░рд╣реЗрдб, рдмрд╣реБрдд рдХрдо рдкрд╛рд╡рд░ рдЙрдкрдпреЛрдЧ, INT4 рдХреНрд╡рд╛рдВрдЯрд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд▓рд┐рдП рд╕рдкреЛрд░реНрдЯ (рдкрд░рдлреЙрд░реНрдореЗрдВрд╕ рдкрд░ рдиреНрдпреВрдирддрдо рдкреНрд░рднрд╛рд╡ рдХреЗ рд╕рд╛рде), рдФрд░ рдкреВрд░реНрдг рдСрди-рдбрд┐рд╡рд╛рдЗрд╕ рд░рдирд┐рдВрдЧ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдЧреЛрдкрдиреАрдпрддрд╛ рдмрдиреА рд░рд╣рддреА рд╣реИред

Aashi Dutt

рд▓реЗрдЦрдХ

Aashi Dutt

рдореИрдВ рдПрдордПрд▓ (Gen AI) рдореЗрдВ Google Developers Expert, Kaggle 3x Expert, рдФрд░ Women Techmakers рдПрдВрдмреЗрд╕рдбрд░ рд╣реВрдБ, рддрдерд╛ рддрдХрдиреАрдХ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ 3+ рд╡рд░реНрд╖реЛрдВ рдХрд╛ рдЕрдиреБрднрд╡ рд░рдЦрддреА рд╣реВрдБред рдореИрдВрдиреЗ 2020 рдореЗрдВ рдПрдХ рд╣реЗрд▓реНрде-рдЯреЗрдХ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдХреА рд╕рд╣-рд╕реНрдерд╛рдкрдирд╛ рдХреА рдФрд░ рд╡рд░реНрддрдорд╛рди рдореЗрдВ Georgia Tech рд╕реЗ рдХрдВрдкреНрдпреВрдЯрд░ рд╡рд┐рдЬреНрдЮрд╛рди рдореЗрдВ рдорд╛рд╕реНрдЯрд░ рдХрд░ рд░рд╣реА рд╣реВрдБ, рдЬрд┐рд╕рдореЗрдВ рдореЗрд░рд╛ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮрддрд╛ рдХреНрд╖реЗрддреНрд░ рдорд╢реАрди рд▓рд░реНрдирд┐рдВрдЧ рд╣реИред

рд╡рд┐рд╖рдп