อินเทอร์เฟซตัวควบคุมปัญญาประดิษฐ์ (AICI) ช่วยให้คุณสร้างคอนโทรลเลอร์ที่ จำกัด และส่งออกโดยตรงของโมเดลภาษาขนาดใหญ่ (LLM) แบบเรียลไทม์ คอนโทรลเลอร์เป็นโปรแกรมที่มีความยืดหยุ่นที่สามารถใช้การถอดรหัสที่ จำกัด การแก้ไขแบบไดนามิกของข้อความแจ้งและข้อความที่สร้างขึ้นและประสานงานการดำเนินการในหลายรุ่นขนาน คอนโทรลเลอร์รวมตรรกะที่กำหนดเองในระหว่างการถอดรหัสโทเค็นโดยอาร์ทเทนและรักษาสถานะในระหว่างการร้องขอ LLM สิ่งนี้ช่วยให้กลยุทธ์การควบคุมที่หลากหลายตั้งแต่การถอดรหัสแบบโปรแกรมหรือแบบสอบถามไปจนถึงการสนทนาหลายตัวแทนไปจนถึงการดำเนินการอย่างมีประสิทธิภาพในการรวมเข้ากับ LLM อย่างเข้มงวด
จุดประสงค์ของ AICI คือการทำให้ง่ายต่อการสร้างและทดสอบด้วยกลยุทธ์คอนโทรลเลอร์ที่มีอยู่และใหม่ทั้งหมดสำหรับการปรับปรุงรุ่น LLM ด้วยการสรุปรายละเอียดการใช้งานของการอนุมาน LLM และการให้บริการเอ็นจิ้น AICI มีจุดมุ่งหมายเพื่อให้การพัฒนาของตัวควบคุมง่ายขึ้นทำให้ง่ายต่อการเขียนตัวควบคุมที่รวดเร็วและง่ายขึ้นในการเข้ากันได้ตลอดการอนุมาน LLM
AICI ได้รับการออกแบบมาสำหรับการดำเนินการทั้งในท้องถิ่นและคลาวด์รวมถึงการปรับใช้ LLM แบบหลายผู้เช่า (ในที่สุด) คอนโทรลเลอร์ถูกนำไปใช้เป็นโมดูล WebAssembly (WASM) ที่มีน้ำหนักเบา (WASM) ซึ่งทำงานบนเครื่องเดียวกับเอ็นจิ้นการอนุมาน LLM โดยใช้ CPU ในขณะที่ GPU กำลังยุ่งอยู่กับการสร้างโทเค็น AICI เป็นหนึ่งชั้นในสแต็กการอนุมานและได้รับการออกแบบมาเพื่ออนุญาตให้ห้องสมุดควบคุมเช่นคำแนะนำ, LMQL และอื่น ๆ เพื่อทำงานด้านบนของมันและได้รับทั้งประสิทธิภาพและการปรับปรุงประสิทธิภาพรวมถึงการพกพาในการอนุมาน LLM และการให้บริการเครื่องยนต์
ปัจจุบัน AICI รวมเข้ากับ Llama.cpp, HuggingFace Transformers และ RLLM (เอ็นจิ้นการอนุมาน LLM ที่ใช้ TCH ที่กำหนดเอง) โดยมี VLLM ในผลงาน
aici คือ:
AICI เป็นต้นแบบออกแบบและสร้างที่ Microsoft Research
ใน quickstart นี้เราจะแนะนำคุณผ่านขั้นตอนต่อไปนี้:
ในการรวบรวมส่วนประกอบ AICI คุณต้องตั้งค่าสภาพแวดล้อมการพัฒนาของคุณสำหรับการเกิดสนิม สำหรับ quickstart นี้คุณต้องใช้ Python 3.11 หรือใหม่กว่าเพื่อสร้างคอนโทรลเลอร์
บันทึก
ผู้ใช้ Windows : โปรดใช้ WSL2 หรือ DevContainer ที่ให้มา การเพิ่มการสนับสนุน Windows ดั้งเดิมได้รับการติดตามที่นี่
ผู้ใช้ MACOS : โปรดตรวจสอบให้แน่ใจว่าคุณติดตั้งเครื่องมือบรรทัดคำสั่ง XCODE โดยเรียกใช้ xcode-select -p และหากไม่ได้ติดตั้งให้เรียกใช้ xcode-select --install
CUDA : CUDA Build อาศัยการติดตั้ง libtorch เฉพาะ ขอแนะนำเป็นอย่างยิ่งที่คุณใช้ devcontainer ที่ให้มา
หากคุณใช้ DevContainer คุณสามารถข้ามไปยังส่วนถัดไป
การใช้ System Package Manager ติดตั้งเครื่องมือที่จำเป็นสำหรับการสร้างรหัสในที่เก็บรวมถึง git , cmake และ ccache
ตัวอย่างเช่นใน WSL / Ubuntu โดยใช้ apt :
sudo apt-get install --assume-yes --no-install-recommends
build-essential cmake ccache pkg-config libssl-dev libclang-dev clang llvm-dev git-lfs
หรือใช้ homebrew บน macOS:
brew install git cmake ccache
จากนั้นติดตั้ง สนิมสนิมและสินค้า ตามคำแนะนำที่ให้ไว้ที่นี่และที่นี่:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
หลังจากการติดตั้งตรวจสอบว่าคำสั่ง rustup --version สามารถเข้าถึงได้โดยเรียกใช้จากเทอร์มินัล หากไม่ได้รับการยอมรับคำสั่งให้ลองเปิดเทอร์มินัลใหม่
การติดตั้งส่วนประกอบ Rust Wasm32-Wasi ครั้งต่อไป:
rustup target add wasm32-wasi
หากคุณติดตั้ง Rust แล้วหรือได้รับการร้องเรียนจากสินค้าเกี่ยวกับเวอร์ชันที่ล้าสมัยรัน:
rustup update
สุดท้ายในการทำงานกับตัวควบคุม Python และสคริปต์ (เช่นบทช่วยสอนนี้) ให้เรียกใช้คำสั่งนี้เพื่อติดตั้งแพ็คเกจที่ต้องการ:
pip install pytest pytest-forked ujson posix_ipc numpy requests
เซิร์ฟเวอร์ RLLM มีสองแบ็กเอนด์หนึ่งอันขึ้นอยู่กับ libtorch และ cuda ( rllm-cuda ) และอื่น ๆ ขึ้นอยู่กับ llama.cpp ( rllm-llamacpp )
แบ็กเอนด์ rllm-cuda ทำงานกับ Nvidia GPUs ที่มีความสามารถในการคำนวณ 8.0 หรือใหม่กว่า (A100 และหลังจากนั้น RTX 30x0 และหลังจากนั้น) และต้องมีการตั้งค่า libtorch อย่างหนัก-ขอแนะนำอย่างยิ่งให้ใช้ devcontainer ที่รวมอยู่ ในขณะที่คู่มือนี้มุ่งเน้นไปที่แบ็กเอนด์ rllm-llamacpp ขั้นตอนการสร้างจะเหมือนกันสำหรับ rllm-cuda , Modulo ชื่อโฟลเดอร์
หลังจากการตั้งค่า Dev Env ด้านบนโคลนที่เก็บ AICI และดำเนินการตามขั้นตอนถัดไปที่ระบุไว้ด้านล่าง
ใช้คำสั่งต่อไปนี้เพื่อสร้างและเรียกใช้ aicirt และ rllm-llamacpp :
cd rllm/rllm-llamacpp
./server.sh phi2
คุณสามารถส่งชื่อโมเดลอื่น ๆ เป็นอาร์กิวเมนต์ (run ./server.sh ที่ไม่มีอาร์กิวเมนต์เพื่อดูโมเดลที่มีอยู่) นอกจากนี้คุณยังสามารถใช้ URL HuggingFace ไปยังไฟล์ .gguf หรือพา ธ โลคัลไปยังไฟล์. .gguf (สำหรับ rllm-cuda ใช้ ID Model HuggingFace หรือเส้นทางไปยังโฟลเดอร์)
./server.sh orca
คุณสามารถค้นหารายละเอียดเพิ่มเติมเกี่ยวกับ rllm-llamacpp ได้ที่นี่
เซิร์ฟเวอร์ RLLM ให้อินเทอร์เฟซ HTTP ที่ใช้สำหรับงานการกำหนดค่าและคำขอการประมวลผล นอกจากนี้คุณยังสามารถใช้อินเทอร์เฟซนี้เพื่อตรวจสอบสถานะทันที ตัวอย่างเช่นหากคุณเปิด http://127.0.0.1:4242/v1/models คุณควรเห็น:
{
"object" : " list " ,
"data" : [
{
"object" : " model " ,
"id" : " TheBloke/phi-2-GGUF " ,
"created" : 946810800 ,
"owned_by" : " owner "
}
]
}ยืนยันว่ามีการโหลดโมเดลที่เลือก
AICI อนุญาตให้โฮสต์ตรรกะที่กำหนดเองเรียกว่า คอนโทรลเลอร์ ที่เริ่มต้นยุติและโต้ตอบกับการสร้างโทเค็น LLMS คอนโทรลเลอร์ใช้อาร์กิวเมนต์อินพุตประมวลผลและส่งคืนผลลัพธ์ด้วยบันทึกโทเค็น LLM และตัวแปร
ที่เก็บรวมถึงตัวอย่างบางส่วนโดยเฉพาะ:
ในตัวอย่างนี้เราจะใช้ PYCTRL เพื่อจัดการการสร้างโทเค็นโดยใช้ สคริปต์ Python อย่างง่าย หากคุณต้องการคุณสามารถสร้างและอัปโหลด PYCTRL ได้อย่างไรก็ตามโดยค่าเริ่มต้นเซิร์ฟเวอร์จะดาวน์โหลด PYCTRL รุ่นล่าสุดจาก GitHub โดยอัตโนมัติ
โดยทั่วไปคอนโทรลเลอร์จำเป็นต้องมีการสร้างและการปรับใช้ในขณะที่สคริปต์ (Python หรือ JavaScript) จะถูกส่งไปพร้อมกับคำขอแต่ละครั้ง
ต่อไปนี้แสดงให้เห็นถึงความสัมพันธ์ระหว่างเซิร์ฟเวอร์ RLLM รันไทม์ AICI และคอนโทรลเลอร์:
Erdiagram
โฮสต์ ||-| {CPU: ""
โฮสต์ ||-| {gpu: ""
CPU ||-|| "เซิร์ฟเวอร์ rllm": ดำเนินการ
CPU ||-| {"AICI Runtime": ดำเนินการ
"Aici Runtime" ||-|| "คอนโทรลเลอร์": อินสแตนซ์
GPU ||-| {"LLM Token Generation": ดำเนินการ
สมมติว่าเราตั้งเป้าหมายให้โมเดลสร้างรายการยึดติดกับรูปแบบเฉพาะและมีเพียงห้ารายการ
โดยทั่วไปแล้วการบรรลุเป้าหมายนี้เกี่ยวข้องกับวิศวกรรมที่รวดเร็วการกำหนดคำแนะนำที่ชัดเจนด้วยคำแนะนำที่ชัดเจนเช่น:
What are the five most popular types of vehicles?
Return the result as a numbered list.
Do not add explanations, only the list.
พรอมต์จะแตกต่างกันไปขึ้นอยู่กับแบบจำลองที่ใช้เนื่องจากแต่ละรุ่นมีแนวโน้มที่จะเพิ่มคำอธิบายและเข้าใจคำแนะนำในรูปแบบที่แตกต่างกัน
ด้วย AICI เราเปลี่ยนการควบคุมกลับเป็นรหัสและเราสามารถทำให้พรอมต์ง่ายขึ้นเป็น:
What are the most popular types of vehicles?
ใช้รหัสเพื่อ:
มาสร้างไฟล์ Python list-of-five.py ด้วยเนื้อหาต่อไปนี้:
import pyaici . server as aici
# Force the model to generate a well formatted list of 5 items, e.g.
# 1. name 1
# 2. name 2
# 3. name 3
# 4. name 4
# 5. name 5
async def main ():
# This is the prompt we want to run.
# Note how the prompt doesn't mention a number of vehicles or how to format the result.
prompt = "What are the most popular types of vehicles? n "
# Tell the model to generate the prompt string, ie. let's start with the prompt "to complete"
await aici . FixedTokens ( prompt )
# Store the current position in the token generation process
marker = aici . Label ()
for i in range ( 1 , 6 ):
# Tell the model to generate the list number
await aici . FixedTokens ( f" { i } ." )
# Wait for the model to generate a vehicle name and end with a new line
await aici . gen_text ( stop_at = " n " )
await aici . FixedTokens ( " n " )
# Store the tokens generated in a result variable
aici . set_var ( "result" , marker . text_since ())
aici . start ( main ())การเรียกใช้สคริปต์ไม่แตกต่างจากการส่งพรอมต์ ในกรณีนี้เรากำลังส่งตรรกะการควบคุมและคำแนะนำทั้งหมดเข้าด้วยกัน
หากต้องการดูผลลัพธ์สุดท้ายให้ดำเนินการคำสั่งต่อไปนี้:
./aici.sh run list-of-five.py
ผลลัพธ์:
Running with tagged AICI Controller: gh:microsoft/aici/pyctrl
[0]: FIXED 'What are the most popular types of vehicles?n'
[0]: FIXED '1.'
[0]: GEN ' Carsn'
[0]: FIXED '2.'
[0]: GEN ' Motorcyclesn'
[0]: FIXED '3.'
[0]: GEN ' Bicyclesn'
[0]: FIXED '4.'
[0]: GEN ' Trucksn'
[0]: FIXED '5.'
[0]: GEN ' Boatsn'
[0]: FIXED 'n'
[DONE]
[Response] What are the most popular types of vehicles?
1. Cars
2. Motorcycles
3. Bicycles
4. Trucks
5. Boats
response saved to tmp/response.json
Usage: {'sampled_tokens': 16, 'ff_tokens': 37, 'cost': 69}
Timing: {'http_response': 0.05193686485290527, 'data0': 0.05199289321899414, 'first_token': 0.0658726692199707, 'last_token': 0.1784682273864746}
Tokens/sec: {'prompt': 861.0913072488067, 'sampling': 89.65181217019571}
Storage: {'result': '1. Carsn2. Motorcyclesn3. Bicyclesn4. Trucksn5. Boatsnn'}
ที่เก็บนี้มีส่วนประกอบจำนวนหนึ่งและส่วนที่คุณต้องการขึ้นอยู่กับกรณีการใช้งานของคุณ
คุณสามารถ ใช้โมดูลคอนโทรลเลอร์ที่มีอยู่ เราให้บริการ PYCTRL และ JSCTRL ที่ให้คุณควบคุมสคริปต์โดยใช้ Python ฝั่งเซิร์ฟเวอร์และ JavaScript ตามลำดับ แพ็คเกจ PYAICI มีเครื่องมือบรรทัดคำสั่ง aici ที่ให้คุณอัปโหลดและเรียกใช้สคริปต์ด้วยคอนโทรลเลอร์ใด ๆ (เรายังให้คำจำกัดความ REST API สำหรับ Curious)
python ตัวอย่างรหัสสำหรับการเขียนสคริปต์ pyctrl และ JavaScript Hello World สำหรับ JSCTRL
เราคาดว่าห้องสมุดจะถูกสร้างขึ้นบนตัวควบคุม เราให้ตัวอย่างใน PromptLib - ไลบรารี Python ฝั่งไคลเอ็นต์ที่สร้างการโต้ตอบกับ dectctrl ผ่านแพ็คเกจ pyaici
? สมุดบันทึกตัวอย่างที่ใช้ PromptLib เพื่อโต้ตอบกับ declctrl
คอนโทรลเลอร์สามารถทำงานได้ในระบบการอนุมาน LLM ที่เปิดใช้งาน LLM ที่เปิดใช้งาน AICI คุณสามารถ เรียกใช้เอ็นจิ้นอ้างอิงที่ให้มา (RLLM) ในพื้นที่ ด้วย libtorch+cuda หรือ llama.cpp แบ็กเอนด์
ใน การพัฒนาคอนโทรลเลอร์ใหม่ ให้ใช้โครงการเริ่มต้นที่เป็นสนิมที่แสดงการใช้งานของไลบรารี AICI_ABI ซึ่งทำให้การใช้อินเทอร์เฟซ AICI ระดับต่ำง่ายขึ้น
? ตัวอย่างรหัสสำหรับคอนโทรลเลอร์ใหม่ที่น้อยที่สุดเพื่อให้คุณเริ่มต้น
ใน การเพิ่มการสนับสนุน AICI ให้กับเอ็นจิ้นการอนุมาน LLM ใหม่ คุณจะต้องใช้โปรโตคอลด้าน LLM ที่พูดถึง AICI Runtime
ในที่สุดคุณอาจต้องการแก้ไขส่วนประกอบใด ๆ ที่ให้ - PRS ยินดีต้อนรับมากที่สุด!
AICI บทคัดย่อเอ็นจิ้นการอนุมาน LLM จากคอนโทรลเลอร์และในทางกลับกันเช่นเดียวกับในภาพด้านล่าง โหนดโค้งมนเป็นแรงบันดาลใจ สามารถสร้างเลเยอร์เพิ่มเติมได้ที่ด้านบน - เราให้บริการ Prettlib แต่เราเชื่อมั่นอย่างยิ่งว่าคำแนะนำ, LMQL, Sglang, โครงร่าง, Jsonformer, LMFE ฯลฯ ยังสามารถทำงานบน AICI (ไม่ว่าจะเป็นตัวควบคุมที่กำหนดเองหรือใช้ PYCTRL หรือ JSCTRL)
กราฟ TD
pyctrl-aici-> aicirt [aici-runtime]
jsctrl -aici -> aicirt
คำแนะนำ ([guidancectrl]) -aici -> aicirt
lmql ([lmql ctrl]) -aici -> aicirt
aicirt -posix shm -> rllm
aicirt -posix shm -> llama [llama.cpp]
aicirt -posix shm -> pyaici
Pyaici -Python -> Vllm (Vllm)
Pyaici -Python -> HF [HF Transformers]
แพ็คเกจ PYAICI ช่วยให้ง่ายต่อการรวม AICI เข้ากับเอ็นจินการอนุมาน LLM ที่ใช้ Python ลองดูการรวมเข้ากับ Transformers HuggingFace แม้ว่าโปรดทราบว่ามันไม่สนับสนุน Forking (การสร้างหลายลำดับในแบบคู่ขนาน) เซิร์ฟเวอร์ VLLM REST ปัจจุบันล้าสมัย โปรดใช้ rllm-cuda หรือ rllm-llama.cpp สำหรับตอนนี้
aicirt ทำงานในกระบวนการแยกต่างหากและสามารถทำงานภายใต้ผู้ใช้ที่แตกต่างจากเอ็นจิ้น LLMaici_host_* ได้เท่านั้นที่ใช้ใน hostimpl.rsaicirt ยังเปิดเผยอินเทอร์เฟซ WASI บางส่วน อย่างไรก็ตามฟังก์ชั่นเกือบทั้งหมดไม่ได้เป็นแบบใดยกเว้น fd_write ซึ่งตัวอธิบายไฟล์ shims 1 และ 2 (stdout และ stderr) เพื่อพิมพ์ข้อความการดีบักโดยเฉพาะอย่างยิ่งโมดูล WASM ไม่สามารถเข้าถึงระบบไฟล์เครือข่ายหรือทรัพยากรอื่น ๆ พวกเขายังไม่สามารถหมุนเธรดหรือเข้าถึงตัวจับเวลาใด ๆ (สิ่งนี้เกี่ยวข้องกับการโจมตี Spectre/Meltdown)
การคำนวณส่วนใหญ่ในคอนโทรลเลอร์ AICI เกิดขึ้นบน CPU ควบคู่ไปกับการสร้าง logit บน GPU การสร้างเกิดขึ้นในขั้นตอนที่ logits ถูกสร้างขึ้นขนานสำหรับโทเค็นใหม่สำหรับแต่ละลำดับในแบทช์ (โดยทั่วไประหว่าง 1 ถึง 50) สิ่งนี้เกี่ยวข้องกับการอ่านโมเดลทั้งหมดและแคช KV สำหรับลำดับในชุดจากหน่วยความจำ GPU สำหรับปริมาณงานแบทช์ที่ดีที่สุดโมเดลและ KV แคชควรใช้ส่วนที่สำคัญของหน่วยความจำ GPU และการอ่านหน่วยความจำทั้งหมดใช้เวลาประมาณ 40ms ใน A100 GPU (80GB)
ดังนั้นแต่ละขั้นตอนของการสร้างจะอยู่ในลำดับ 20-50ms ด้วยวิศวกรรมที่ระมัดระวังสิ่งนี้มากเกินพอที่จะคำนวณชุดโทเค็นที่ได้รับอนุญาตในสนิมที่รวบรวมกับ WASM สิ่งเหล่านี้สามารถรวมกันได้ทั้งในสนิมหรือผ่านล่าม Python หรือ JavaScript ที่เรามีให้
ตัวอย่างเช่นการคำนวณที่ได้รับอนุญาตให้ใช้โทเค็นในรูปแบบคำศัพท์ 32000 ที่แข็งแกร่งของรุ่น Llama ใช้:
ตัวเลขข้างต้นมีไว้สำหรับลำดับเดียวอย่างไรก็ตามแต่ละลำดับจะถูกประมวลผลในกระบวนการแยกต่างหากและหากมีแกนมากกว่าลำดับ (ซึ่งเป็นเรื่องปกติ) พวกเขาจะไม่เปลี่ยนแปลง พวกเขายังรวมถึงค่าใช้จ่ายในการโทรเข้าสู่ Python Interpreter ที่ใช้ใน WASM และจากนั้นกลับเข้าสู่รหัส WASM ที่สร้างขึ้นเป็นสนิมสำหรับข้อ จำกัด พวกเขาทั้งหมดอยู่ในงบประมาณ 20-50ms ดังนั้นจึงไม่ส่งผลกระทบต่อเวลารุ่นเลย
นอกจากนี้ยังมีค่าใช้จ่ายบางอย่างในเส้นทางที่สำคัญของการสุ่มตัวอย่าง มันลงมาที่ประมาณ 0.3ms ต่อขั้นตอนการสร้างเมื่อดำเนินการ 10 ลำดับในแบบขนาน (นี่คือข้อ จำกัด ที่ใช้) ค่าใช้จ่ายสูงถึงประมาณ 0.7ms สำหรับ 40 ลำดับ (แม้ว่าจะยังไม่ได้รับการปรับให้เหมาะสมอย่างเต็มที่)
WebAssembly ได้รับการออกแบบให้มีค่าใช้จ่ายน้อยที่สุดเมื่อเทียบกับรหัสดั้งเดิม จากประสบการณ์ของเรารหัสสนิมที่ได้รับการปรับปรุงอย่างสูงจะช้าลงน้อยกว่า 2x เมื่อทำงานในเวลาไม่ได้ นี่คือ 10-100x ดีกว่า JavaScript หรือ Python
การวัดทั้งหมดที่ทำบน AMD EPYC 7V13 กับ NVIDIA A100 GPU พร้อม 80GB ของ VRAM
อินเทอร์เฟซระดับต่ำที่ AICI Runtime ให้อนุญาต:
สามารถใช้งานได้จากภาษาใด ๆ ที่รวบรวมเป็น WASM
ที่เก็บนี้ให้ห้องสมุดสนิมที่ทำให้ง่ายต่อการใช้คอนโทรลเลอร์ในการเกิดสนิมและให้การใช้งานที่มีประสิทธิภาพของข้อ จำกัด เฉพาะ (การแสดงออกปกติ, ไวยากรณ์ YACC, substrings) นอกจากนี้เรายังให้บริการล่าม Python และ JavaScript ที่อนุญาตให้ติดกาวข้อ จำกัด เหล่านี้เข้าด้วยกัน สิ่งเหล่านี้สามารถขยายได้ง่าย
หากคุณพบอินเทอร์เฟซคอนโทรลเลอร์ AI และแนวคิดในการกำหนดเลเยอร์ใหม่ในสแต็กการอนุมาน LLM ที่มีประโยชน์โปรดอ้างอิงแพ็คเกจโดยใช้ข้อมูลอ้างอิงต่อไปนี้:
bibtex:
@misc { Moskal2024 ,
author = { Moskal, Michal and Musuvathi, Madan and {Ki ci man}, Emre } ,
title = { {AI Controller Interface} } ,
year = { 2024 } ,
publisher = { {GitHub} } ,
journal = { {GitHub} repository } ,
howpublished = { url{https://github.com/microsoft/aici/} }
}โครงการนี้ยินดีต้อนรับการมีส่วนร่วมและข้อเสนอแนะ การมีส่วนร่วมส่วนใหญ่กำหนดให้คุณต้องยอมรับข้อตกลงใบอนุญาตผู้มีส่วนร่วม (CLA) ประกาศว่าคุณมีสิทธิ์และทำจริงให้สิทธิ์ในการใช้การบริจาคของคุณ สำหรับรายละเอียดเยี่ยมชม https://cla.opensource.microsoft.com
เมื่อคุณส่งคำขอดึง CLA บอทจะพิจารณาโดยอัตโนมัติว่าคุณจำเป็นต้องให้ CLA และตกแต่ง PR อย่างเหมาะสม (เช่นการตรวจสอบสถานะแสดงความคิดเห็น) เพียงทำตามคำแนะนำที่จัดทำโดยบอท คุณจะต้องทำสิ่งนี้เพียงครั้งเดียวใน repos ทั้งหมดโดยใช้ CLA ของเรา
โครงการนี้ได้นำรหัสการดำเนินงานของ Microsoft โอเพ่นซอร์สมาใช้ สำหรับข้อมูลเพิ่มเติมโปรดดูจรรยาบรรณคำถามที่พบบ่อยหรือติดต่อ [email protected] พร้อมคำถามหรือความคิดเห็นเพิ่มเติมใด ๆ
โครงการนี้อาจมีเครื่องหมายการค้าหรือโลโก้สำหรับโครงการผลิตภัณฑ์หรือบริการ การใช้เครื่องหมายการค้าหรือโลโก้ของ Microsoft ที่ได้รับอนุญาตขึ้นอยู่กับและต้องปฏิบัติตามแนวทางเครื่องหมายการค้าและแบรนด์ของ Microsoft การใช้เครื่องหมายการค้าหรือโลโก้ของ Microsoft ในรุ่นที่แก้ไขของโครงการนี้จะต้องไม่ทำให้เกิดความสับสนหรือบอกเป็นสปอนเซอร์ของ Microsoft การใช้เครื่องหมายการค้าหรือโลโก้ของบุคคลที่สามจะอยู่ภายใต้นโยบายของบุคคลที่สามเหล่านั้น