თვრამეტი თვის წინ, კომპანია Zama-მ დაიწყო Concrete ML-ზე მუშაობა. ეს არის მანქანური სწავლების ფრეიმვორკი, რომელიც უზრუნველყოფს კონფიდენციალურობას და ინტეგრირებულია ტრადიციულ ML ფრეიმვორკებთან, როგორიცაა scikit-learn, ONNX, PyTorch და TensorFlow. მომხმარებლის მონაცემების კონფიდენციალურობის უზრუნველსაყოფად, Zama იყენებს სრულად ჰომომორფულ დაშიფრვას (FHE) – კრიპტოგრაფიულ ინსტრუმენტს, რომელიც იძლევა საშუალებას, პირდაპირი გამოთვლები განხორციელდეს დაშიფრულ მონაცემებზე პირადი გასაღების ცოდნის გარეშე. თავიდანვე გვინდოდა, წინასწარ კომპილირებული FHE-თან თავსებადი ქსელები ხელმისაწვდომი გაგვეხადა ინტერნეტში, რათა მომხმარებლებს მათი მარტივად გამოყენება შეძლებოდათ. დღეს ჩვენ მზად ვართ! და არა უბრალოდ ინტერნეტის რომელიმე შემთხვევით ადგილას, არამედ პირდაპირ Hugging Face-ზე. უფრო ზუსტად, ჩვენ ვიყენებთ Hugging Face Endpoints-ს და მორგებულ ინფერენსის (დასკვნის) ჰენდლერებს, რათა შევძლოთ Concrete ML მოდელების შენახვა და მომხმარებლებს მივცეთ საშუალება, ისინი Hugging Face-ის მანქანებზე ერთი დაწკაპუნებით განათავსონ. ამ ბლოგპოსტის ბოლოს გაიგებთ, როგორ გამოიყენოთ წინასწარ კომპილირებული მოდელები და როგორ მოამზადოთ თქვენი საკუთარი. ეს ბლოგი ასევე შეიძლება ჩაითვალოს, როგორც კიდევ ერთი გაკვეთილი მორგებული ინფერენსის ჰენდლერებისთვის. დავიწყოთ FHE-თან თავსებადი მოდელის განთავსებით (მომზადებული Zama-ს ან მესამე მხარეების მიერ – იხილეთ ქვემოთ მოცემული „თქვენი წინასწარ კომპილირებული მოდელის მომზადების“ განყოფილება, თუ როგორ მოამზადოთ თქვენი საკუთარი). პირველ რიგში, მოძებნეთ მოდელი, რომლის განთავსებაც გსურთ: ჩვენ წინასწარ კომპილირებული გვაქვს მრავალი მოდელი Zama-ს Hugging Face გვერდზე (ან შეგიძლიათ იპოვოთ ისინი ტეგების გამოყენებით). დავუშვათ, აირჩიეთ concrete-ml-encrypted-decisiontree: როგორც აღწერაშია განმარტებული, ეს წინასწარ კომპილირებული მოდელი საშუალებას გაძლევთ, სპამი აღმოაჩინოთ შეტყობინების შინაარსის ნათლად დანახვის გარეშე. Hugging Face პლატფორმაზე არსებული ნებისმიერი სხვა მოდელის მსგავსად, აირჩიეთ „Deploy“ (განთავსება) და შემდეგ „Inference Endpoint (dedicated)“ (ინფერენსის Endpoint – გამოყოფილი). შემდეგ, აირჩიეთ Endpoint-ის სახელი ან რეგიონი და, რაც ყველაზე მნიშვნელოვანია, CPU (ამჟამად Concrete ML მოდელები არ იყენებენ GPU-ებს; ამაზე ვმუშაობთ), ისევე როგორც საუკეთესო ხელმისაწვდომი მანქანა – ქვემოთ მოცემულ მაგალითში ჩვენ ავირჩიეთ რვა vCPU. ახლა დააჭირეთ „Create Endpoint“ (Endpoint-ის შექმნა) და დაელოდეთ ინიციალიზაციის დასრულებას. რამდენიმე წამის შემდეგ, Endpoint განთავსდება და თქვენი კონფიდენციალურობის დამცავი მოდელი მზად იქნება სამუშაოდ. არ დაგავიწყდეთ Endpoint-ის წაშლა (ან სულ მცირე, მისი შეჩერება), როდესაც აღარ იყენებთ მას, წინააღმდეგ შემთხვევაში მოსალოდნელზე მეტი დაგიჯდებათ. მიზანია არა მხოლოდ თქვენი Endpoint-ის განთავსება, არამედ თქვენს მომხმარებლებს მიეცეს საშუალება, მასთან ითამაშონ. ამისათვის მათ უნდა მოახდინონ რეპოზიტორიის კლონირება საკუთარ კომპიუტერზე. ეს ხდება ჩამოსაშლელ მენიუში „Clone Repository“ (რეპოზიტორიის კლონირება) არჩევით. მათ მიეცემათ პატარა ბრძანების ხაზი, რომლის გაშვებაც შეუძლიათ ტერმინალში: ბრძანების შესრულების შემდეგ, ისინი გადადიან concrete-ml-encrypted-decisiontree დირექტორიაში და ხსნიან play_with_endpoint.py ფაილს თავიანთი რედაქტორით. აქ ისინი იპოვიან ხაზს API_URL = … და უნდა შეცვალონ იგი წინა ნაწილში შექმნილი Endpoint-ის ახალი URL-ით. რა თქმა უნდა, შეავსეთ ის თქვენი Entrypoint-ის URL-ით. ასევე, განსაზღვრეთ წვდომის ტოკენი და შეინახეთ ის გარემოს ცვლადში: და ბოლოს, თქვენი მომხმარებლის მანქანებზე ლოკალურად უნდა იყოს დაინსტალირებული Concrete ML: შექმენით ვირტუალური გარემო, გაააქტიურეთ ის და დააინსტალირეთ საჭირო დამოკიდებულებები: გაითვალისწინეთ, რომ ამჟამად ჩვენ ვაიძულებთ Python 3.10-ის გამოყენებას (რაც ასევე ნაგულისხმევი Python ვერსიაა Hugging Face Endpoints-ში). ეს იმიტომ ხდება, რომ ჩვენი განვითარების ფაილები ამჟამად დამოკიდებულია Python-ის ვერსიაზე. ჩვენ ვმუშაობთ მათ დამოუკიდებლად ქცევაზე. ეს ხელმისაწვდომი იქნება მომავალ ვერსიაში. ახლა თქვენს მომხმარებლებს შეუძლიათ Endpoint-ზე ინფერენსის გაშვება სკრიპტის ამოქმედებით: მან უნდა წარმოქმნას მსგავსი ლოგები: თუ შეცვლით play_with_endpoint.py ფაილს, დაინახავთ, რომ ჩვენ ვიმეორებთ ტესტის მონაცემთა ნაკრების სხვადასხვა ნიმუშს და ვაწარმოებთ დაშიფრულ ინფერენსებს პირდაპირ Endpoint-ზე. რა თქმა უნდა, ეს მხოლოდ Entrypoint-ის გამოყენების მაგალითია. დეველოპერებს მოუწოდებენ, მოარგონ ეს მაგალითი საკუთარ გამოყენების შემთხვევას ან აპლიკაციას. გთხოვთ, გაითვალისწინოთ, რომ ეს ყველაფერი შესრულებულია მორგებული ჰენდლერების მოქნილობის წყალობით, და ჩვენ მადლიერებას გამოვხატავთ Hugging Face-ის დეველოპერების მიმართ ასეთი მოქნილობის შეთავაზებისთვის. მექანიზმი განსაზღვრულია handler.py ფაილში. როგორც Hugging Face-ის დოკუმენტაციაშია განმარტებული, თქვენ შეგიძლიათ განსაზღვროთ EndpointHandler-ის __call__ მეთოდი თითქმის ისე, როგორც გსურთ: ჩვენს შემთხვევაში, ჩვენ განვსაზღვრეთ მეთოდის პარამეტრი, რომელიც შეიძლება იყოს save_key (FHE შეფასების გასაღებების შესანახად), append_key (FHE შეფასების გასაღებების ნაწილ-ნაწილ შესანახად, თუ გასაღები ძალიან დიდია ერთი ზარით გასაგზავნად) და ბოლოს inference (FHE ინფერენსების გასაშვებად). ეს მეთოდები გამოიყენება შეფასების გასაღების ერთხელ დასაყენებლად და შემდეგ ყველა ინფერენსის სათითაოდ გასაშვებად, როგორც ნაჩვენებია play_with_endpoint.py ფაილში. თუმცა, შეიძლება აღინიშნოს, რომ გასაღებები ინახება Endpoint-ის ოპერატიულ მეხსიერებაში (RAM), რაც არ არის მოსახერხებელი საპროდუქციო გარემოსთვის: ყოველი გადატვირთვისას, გასაღებები იკარგება და საჭიროა მათი ხელახლა გაგზავნა. გარდა ამისა, როდესაც გაქვთ რამდენიმე მანქანა მასიური ტრაფიკის სამართავად, ეს ოპერატიული მეხსიერება არ არის გაზიარებული მანქანებს შორის. საბოლოოდ, ხელმისაწვდომი CPU მანქანები Endpoint-ებისთვის უზრუნველყოფენ მაქსიმუმ რვა vCPU-ს, რაც შეიძლება იყოს შეზღუდვა მაღალი დატვირთვის აპლიკაციებისთვის.