Аж үйлдвэрийн машин сурах: 10 дизайны зарчим

Аж үйлдвэрийн машин сурах: 10 дизайны зарчим

Өнөө үед өдөр бүр шинэ үйлчилгээ, программууд болон бусад чухал программууд бий болж, гайхалтай зүйлсийг бүтээх боломжтой: SpaceX пуужинг удирдах программ хангамжаас эхлээд ухаалаг гар утсаараа дараагийн өрөөнд байгаа данхтай харьцах хүртэл.

Заримдаа шинэхэн програмист хүн бүр, тэр хүсэл эрмэлзэлтэй стартапчин эсвэл жирийн Full Stack эсвэл Data Scientist бай хамаагүй эрт орой хэзээ нэгэн цагт программчлах, амьдралыг хялбаршуулдаг программ хангамжийг бий болгоход тодорхой дүрмүүд байдгийг ухаардаг.

Энэ нийтлэлд би 10 хүчин зүйлийн Апп арга зүйд тулгуурлан үйлдвэрлэлийн машин сургалтыг програм/үйлчилгээнд хялбархан нэгтгэх 12 зарчмыг товч тайлбарлах болно. Хероку багийн санал болгосон. Миний санаачилга бол олон хөгжүүлэгчид болон өгөгдлийн шинжлэх ухааны хүмүүст туслах энэхүү аргын талаарх мэдлэгийг нэмэгдүүлэх явдал юм.

Энэ нийтлэл нь үйлдвэрлэлийн машин сургалтын тухай цуврал нийтлэлийн оршил юм. Тэдгээрийн дотор би загвараа хэрхэн бодитоор хийж, үйлдвэрлэлд нэвтрүүлэх, түүнд зориулсан API бий болгох, түүнчлэн системдээ ML суулгасан янз бүрийн салбар, компаниудын жишээнүүдийн талаар ярих болно.

1-р зарчим: Нэг кодын суурь

Зарим программистууд эхний үе шатанд үүнийг олохын тулд залхуурсандаа (эсвэл өөрийн гэсэн шалтгаанаар) Git-ийг мартдаг. Тэд нэг бол энэ үгийг бүрмөсөн мартдаг, өөрөөр хэлбэл диск рүү бие бие рүүгээ файл шиддэг/зүгээр л текст шиддэг/ тагтаагаар илгээдэг, эсвэл ажлын явцаа тунгаан бодохгүй, тус бүрийг өөрийн салбар руу, дараа нь мастер.

Энэ зарчим нь: нэг кодын бааз, олон байршуулалттай.

Git-ийг үйлдвэрлэлд болон судалгаа, боловсруулалтад (R&D) аль алинд нь ашиглаж болох бөгөөд энэ нь тийм ч их ашиглагддаггүй.

Жишээлбэл, R&D үе шатанд та өөр өөр өгөгдөл боловсруулах арга, загвар бүхий амлалтуудыг үлдээж, дараа нь хамгийн сайныг нь сонгоод цааш үргэлжлүүлэн ажиллах боломжтой.

Хоёрдугаарт, үйлдвэрлэлд энэ бол орлуулшгүй зүйл юм - та өөрийн код хэрхэн өөрчлөгдөж байгааг байнга харж, аль загвар нь хамгийн сайн үр дүнд хүрсэн, аль код нь эцэст нь ажиллаж байсан, түүнийг ажиллахаа больсон эсвэл буруу үр дүн гаргаж эхлэхэд юу нөлөөлсөнийг мэдэх шаардлагатай болно. . Үүний тулд амлалт өгдөг!

Та мөн төслийнхээ багцыг үүсгэж, жишээ нь Gemfury дээр байрлуулж, дараа нь 1000 удаа дахин бичихгүйн тулд бусад төслүүдэд функцуудыг импортлох боломжтой, гэхдээ дараа нь илүү ихийг хийх боломжтой.

2-р зарчим: Хараат байдлыг тодорхой зарлаж, тусгаарла

Төсөл бүр өөр өөр номын сангуудтай бөгөөд тэдгээрийг хаа нэгтээ ашиглахын тулд гаднаас оруулж ирдэг. Энэ нь Python номын сан эсвэл янз бүрийн зориулалттай бусад хэлний номын сан эсвэл системийн хэрэгсэл эсэхээс үл хамааран таны даалгавар бол:

  • Хараат байдлыг тодорхой зарлах, өөрөөр хэлбэл таны төсөлд хэрэглэгдэж байгаа, суулгах шаардлагатай бүх номын сан, хэрэгсэл, тэдгээрийн хувилбаруудыг агуулсан файлыг (жишээлбэл, Python дээр үүнийг Pipfile эсвэл requirements.txt ашиглан хийж болно. A) сайн ойлгох боломжийг олгодог холбоос: realpython.com/pipenv-guide)
  • Хөгжүүлэх явцад програмынхаа хамаарлыг тусгайлан тусгаарла. Та хувилбаруудыг байнга сольж, жишээ нь Tensorflow-ийг дахин суулгахыг хүсэхгүй байна уу?

Ингэснээр ирээдүйд танай багт нэгдэх хөгжүүлэгчид таны төсөлд хэрэглэгдэж буй номын сангууд болон тэдгээрийн хувилбаруудтай хурдан танилцах боломжтой болохоос гадна та тусгайлан суулгасан хувилбар, сангуудыг өөрсдөө удирдах боломжтой болно. Төсөл нь номын сан эсвэл тэдгээрийн хувилбаруудын нийцэхгүй байдлаас зайлсхийхэд тусална.

Таны аппликешн нь тодорхой үйлдлийн систем дээр суулгаж болох системийн хэрэгслүүдэд найдах ёсгүй. Эдгээр хэрэгслүүдийг мөн хамаарлын манифестэд зарласан байх ёстой. Хэрэгслийн хувилбар (түүнчлэн тэдгээрийн бэлэн байдал) нь тодорхой үйлдлийн системийн системийн хэрэгслүүдтэй тохирохгүй байх нөхцөл байдлаас зайлсхийхийн тулд энэ нь зайлшгүй шаардлагатай.

Тиймээс, curl-ийг бараг бүх компьютер дээр ашиглах боломжтой байсан ч гэсэн та үүнийг хараат байдалд зарлах хэрэгтэй, учир нь өөр платформ руу шилжих үед энэ нь байхгүй байж магадгүй эсвэл таны анхдагч хувилбар биш байх болно.

Жишээ нь, таны requirements.txt дараах байдлаар харагдаж болно.

# Model Building Requirements
numpy>=1.18.1,<1.19.0
pandas>=0.25.3,<0.26.0
scikit-learn>=0.22.1,<0.23.0
joblib>=0.14.1,<0.15.0

# testing requirements
pytest>=5.3.2,<6.0.0

# packaging
setuptools>=41.4.0,<42.0.0
wheel>=0.33.6,<0.34.0

# fetching datasets
kaggle>=1.5.6,<1.6.0

3-р зарчим: Тохиргоо

Төрөл бүрийн хөгжүүлэгч залуус санамсаргүйгээр GitHub-д кодыг AWS-ээс нууц үг болон бусад түлхүүрээр олон нийтийн мэдээллийн санд байршуулж, маргааш нь 6000 доллар, бүр 50000 долларын өртэй болсон тухай түүхийг олон хүн сонссон.

Аж үйлдвэрийн машин сурах: 10 дизайны зарчим

Мэдээжийн хэрэг, эдгээр тохиолдлууд туйлын ноцтой боловч маш чухал ач холбогдолтой юм. Хэрэв та код дотор өөрийн итгэмжлэл эсвэл тохиргоонд шаардлагатай бусад өгөгдлийг хадгалсан бол алдаа гаргаж байна, яагаад гэдгийг тайлбарлах шаардлагагүй гэж бодож байна.

Үүний нэг хувилбар бол тохиргоог орчны хувьсагчдад хадгалах явдал юм. Та орчны хувьсагчдын талаар илүү ихийг уншиж болно энд.

Орчны хувьсагчид ихэвчлэн хадгалагддаг өгөгдлийн жишээ:

  • Домэйн нэрс
  • API URL/URI
  • Нийтийн болон хувийн түлхүүрүүд
  • Харилцагчид (мэйл, утас гэх мэт)

Ингэснээр таны тохиргооны хувьсагч өөрчлөгдвөл кодыг байнга өөрчлөх шаардлагагүй болно. Энэ нь цаг хугацаа, хүчин чармайлт, мөнгөө хэмнэхэд тусална.

Жишээлбэл, хэрэв та туршилт хийхдээ Kaggle API ашигладаг бол (жишээ нь, программ хангамжийг татаж аваад загвараа түүгээр дамжуулан ажиллуулж загвар сайн ажиллаж байгаа эсэхийг шалгах) KAGGLE_USERNAME болон KAGGLE_KEY зэрэг Kaggle-ийн хувийн түлхүүрүүдийг ашиглах ёстой. орчны хувьсагчдад хадгалагдана.

4-р зарчим: Гуравдагч этгээдийн үйлчилгээ

Энд байгаа санаа нь тухайн программыг кодын хувьд орон нутгийн болон гуравдагч талын нөөцийн хооронд ямар ч ялгаагүй байхаар бий болгох явдал юм. Жишээлбэл, та дотоод MySQL болон гуравдагч талын аль алиныг нь холбож болно. Google Maps эсвэл Twitter API зэрэг янз бүрийн API-д мөн адил хамаарна.

Гуравдагч талын үйлчилгээг идэвхгүй болгох эсвэл өөр үйлчилгээг холбохын тулд та дээрх догол мөрөнд дурдсан орчны хувьсагчийн тохиргооны товчлууруудыг өөрчлөх хэрэгтэй.

Тиймээс, жишээ нь код доторх өгөгдлийн багц бүхий файл руу хүрэх замыг тухай бүр зааж өгөхийн оронд pathlib номын санг ашиглаж, config.py доторх өгөгдлийн багц руу хүрэх замыг зарлах нь дээр. Жишээ нь, CircleCI), програм нь шинэ үйлчилгээнд шинэ файлын системийн бүтцийг харгалзан өгөгдлийн багцад хүрэх замыг олж мэдсэн.

Зарчим 5. Бүтээх, гаргах, ажиллуулах хугацаа

Өгөгдлийн шинжлэх ухааны чиглэлээр ажилладаг олон хүмүүс програм хангамж бичих чадвараа сайжруулах нь ашигтай байдаг. Хэрэв бид програмаа аль болох ховор гацаж, аль болох удаан ажиллахгүй байхыг хүсч байвал шинэ хувилбар гаргах үйл явцыг 3 үе шатанд хуваах хэрэгтэй.

  1. Үе шат чуулганууд. Та нүцгэн кодоо хувь хүний ​​нөөцөөр шаардлагатай бүх код, өгөгдлийг агуулсан багц гэж нэрлэнэ. Энэ багцыг угсралт гэж нэрлэдэг.
  2. Үе шат суллах - энд бид тохиргоогоо угсралттай холбосон бөгөөд үүнгүйгээр бид програмаа гаргах боломжгүй болно. Одоо энэ нь эхлүүлэхэд бүрэн бэлэн хувилбар юм.
  3. Дараа нь тайз ирдэг биелэлт. Энд бид хувилбараасаа шаардлагатай процессуудыг ажиллуулж програмыг гаргадаг.

Загварын шинэ хувилбарууд эсвэл бүх шугамыг гаргах ийм систем нь администраторууд болон хөгжүүлэгчдийн хооронд үүрэг хуваарилах, хувилбаруудыг хянах, програмыг хүсээгүй зогсоохоос сэргийлдэг.

Гаргах даалгаврын хувьд .yml файлд өөрийгөө ажиллуулах процессуудыг бичих боломжтой олон өөр үйлчилгээ бий болсон (жишээ нь CircleCI-д энэ нь процессыг өөрөө дэмжихийн тулд config.yml юм). Wheely нь төслүүдэд зориулсан багц үүсгэхэд маш сайн.

Та өөрийн машин сургалтын загварын өөр өөр хувилбар бүхий багцуудыг үүсгэж, дараа нь багцалж, шаардлагатай багцууд болон тэдгээрийн хувилбаруудыг үзэж, тэндээс бичсэн функцүүдээ ашиглах боломжтой. Энэ нь танд загвартаа API үүсгэхэд туслах бөгөөд таны багцыг жишээлбэл Gemfury дээр байршуулах боломжтой.

Зарчим 6. Загвараа нэг буюу хэд хэдэн процесс болгон ажиллуул

Түүнээс гадна процессууд нь хуваалцсан өгөгдөлтэй байх ёсгүй. Өөрөөр хэлбэл, процессууд нь тусад нь байх ёстой бөгөөд бүх төрлийн өгөгдөл нь тусад нь байх ёстой, жишээлбэл, MySQL гэх мэт гуравдагч талын үйлчилгээнүүд эсвэл танд хэрэгтэй зүйлээс хамааран бусад.

Өөрөөр хэлбэл, процессын файлын системд өгөгдлийг хадгалах нь мэдээжийн хэрэг биш юм, эс тэгвээс энэ нь дараагийн хувилбар гаргах/тохиргоог өөрчлөх эсвэл програм ажиллаж байгаа системийг шилжүүлэх үед энэ өгөгдлийг цэвэрлэхэд хүргэж болзошгүй юм.

Гэхдээ нэг үл хамаарах зүйл бий: машин сургалтын төслүүдийн хувьд нэмэлт сангууд эсвэл тэдгээрийн хувилбаруудад ямар нэгэн өөрчлөлт ороогүй бол шинэ хувилбарыг эхлүүлэх бүртээ дахин суулгахгүйн тулд номын сангуудын кэшийг хадгалах боломжтой. Ингэснээр та загвараа үйлдвэрлэлд нэвтрүүлэхэд шаардагдах хугацааг багасгах болно.

Загварыг хэд хэдэн процесс болгон ажиллуулахын тулд та шаардлагатай процессууд болон тэдгээрийн дарааллыг зааж өгсөн .yml файл үүсгэж болно.

Зарчим 7: Дахин ашиглах боломжтой

Таны загвар програмд ​​ажиллаж байгаа процессуудыг эхлүүлэх, зогсооход хялбар байх ёстой. Тиймээс энэ нь танд кодын өөрчлөлт, тохиргооны өөрчлөлтийг хурдан байршуулах, хурдан бөгөөд уян хатан байдлаар масштаблах, ажлын хувилбарын эвдрэлээс урьдчилан сэргийлэх боломжийг олгоно.

Энэ нь таны загвартай ажиллах үйл явц нь:

  • Эхлэх хугацааг багасгах. Тохиромжтой бол эхлүүлэх хугацаа (эхлүүлэх тушаал өгсөн цагаас эхлэн процесс ажиллаж эхлэх хүртэл) хэдхэн секундээс хэтрэхгүй байх ёстой. Дээр дурдсан номын сангийн кэш нь эхлүүлэх хугацааг багасгах нэг арга юм.
  • Зөв төгсгө. Өөрөөр хэлбэл, үйлчилгээний порт дээр сонсох нь үнэхээр түр зогссон бөгөөд энэ порт руу илгээсэн шинэ хүсэлтийг боловсруулахгүй. Энд та DevOps инженерүүдтэй сайн харилцаа холбоо тогтоох хэрэгтэй, эсвэл энэ нь хэрхэн ажилладагийг өөрөө ойлгох хэрэгтэй (мэдээжийн хэрэг, сүүлийнх нь илүү тохиромжтой, гэхдээ ямар ч төсөлд харилцаа холбоо үргэлж хадгалагдах ёстой!)

8-р зарчим: Тасралтгүй байршуулалт/интеграци

Олон компаниуд програм боловсруулах болон байршуулах багуудын хооронд тусгаарлалтыг ашигладаг (програмыг эцсийн хэрэглэгчдэд ашиглах боломжтой болгодог). Энэ нь програм хангамжийн хөгжлийг ихээхэн удаашруулж, түүнийг сайжруулахад ахиц дэвшил гаргах болно. Энэ нь хөгжил ба интеграцчлалыг бүдүүлэгээр хэлбэл, нэгтгэдэг DevOps соёлыг сүйтгэдэг.

Тиймээс энэ зарчим нь таны хөгжлийн орчин аль болох үйлдвэрлэлийн орчинтойгоо ойр байх ёстой гэж заасан байдаг.

Энэ нь дараах боломжийг олгоно:

  1. Гарах хугацааг хэдэн арван дахин багасга
  2. Кодын үл нийцэлээс үүдэлтэй алдааны тоог багасгах.
  3. Энэ нь программыг хөгжүүлэгчид болон ашиглаж буй хүмүүс одоо нэг баг болсон тул ажилчдын ажлын ачааллыг бууруулдаг.

Үүнтэй ажиллах боломжийг олгодог хэрэгслүүд нь CircleCI, Travis CI, GitLab CI болон бусад.

Та загварт хурдан нэмэлт өөрчлөлт оруулж, шинэчилж, нэн даруй эхлүүлэх боломжтой бөгөөд алдаа гарсан тохиолдолд эцсийн хэрэглэгч үүнийг анзаарахгүй байхын тулд ажиллах хувилбар руугаа маш хурдан буцаж ороход хялбар байх болно. Хэрэв та сайн тесттэй бол үүнийг хялбар бөгөөд хурдан хийх боломжтой.

Ялгааг багасгах!!!

Зарчим 9. Таны бүртгэлүүд

Лог (эсвэл "Бүртгэл") нь програм (үйл явдлын урсгал) дотор тохиолддог, ихэвчлэн текст хэлбэрээр бичигдсэн үйл явдлууд юм. Энгийн жишээ: "2020-02-02 - системийн түвшин - үйл явцын нэр." Эдгээр нь програмыг ажиллуулж байх үед хөгжүүлэгчид юу болж байгааг шууд харах боломжтой байхаар бүтээгдсэн. Тэрээр үйл явцын ахиц дэвшлийг харж, энэ нь хөгжүүлэгчийн өөрийнх нь төлөвлөж байгаа эсэхийг ойлгодог.

Энэ зарчим нь та логуудаа файлын системдээ хадгалах ёсгүй гэж заасан байдаг - та зүгээр л дэлгэцэн дээр "гаралт" хийх хэрэгтэй, жишээлбэл, системийн стандарт гаралт дээр үүнийг хийх хэрэгтэй. Ийм байдлаар хөгжүүлэлтийн явцад терминал дахь урсгалыг хянах боломжтой болно.

Энэ нь бүртгэлийг хадгалах шаардлагагүй гэсэн үг үү? Мэдээж үгүй. Таны програм үүнийг хийх ёсгүй - үүнийг гуравдагч талын үйлчилгээнд үлдээгээрэй. Таны аппликейшн нь логийг зөвхөн тодорхой файл эсвэл терминал руу шууд үзэх, эсвэл ерөнхий зориулалтын өгөгдөл хадгалах системд (Hadoop гэх мэт) дамжуулах боломжтой. Таны аппликешн өөрөө бүртгэлийг хадгалах эсвэл түүнтэй харилцах ёсгүй.

Зарчим 10. Туршилт!

Үйлдвэрлэлийн машин сургалтын хувьд энэ үе шат нь маш чухал бөгөөд учир нь та загвар нь зөв ажиллаж, хүссэн зүйлээ үйлдвэрлэдэг гэдгийг ойлгох хэрэгтэй.

Тестийг pytest ашиглан үүсгэж болох бөгөөд хэрэв танд регресс/ангилах даалгавар байгаа бол жижиг өгөгдлийн багц ашиглан туршиж болно.

Үргэлж өөр өөр үр дүн гаргахгүйн тулд гүнзгий суралцах загваруудад ижил үрийг тавихаа бүү мартаарай.

Энэ бол 10 зарчмын товч тайлбар байсан бөгөөд мэдээжийн хэрэг, тэдгээрийг хэрхэн ажилладагийг туршиж үзэхгүйгээр ашиглахад хэцүү байдаг тул энэ нийтлэл нь би хэрхэн бүтээх талаар илчлэх олон сонирхолтой нийтлэлийн оршил юм. үйлдвэрлэлийн машин сургалтын загварууд, тэдгээрийг системд хэрхэн нэгтгэх, эдгээр зарчмууд нь бидний амьдралыг хэрхэн хөнгөвчлөх талаар.

Би бас хэн ч хүсвэл сэтгэгдэл дээр үлдээж болох сайхан зарчмуудыг ашиглахыг хичээх болно.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх