คุณจะเขียนโปรแกรมอย่างง่ายสำหรับอุปกรณ์ D-Wave ได้อย่างไร?


27

ฉันต้องการทราบว่างานสำหรับอุปกรณ์ D-Wave นั้นเขียนด้วยรหัสและส่งไปยังอุปกรณ์อย่างไร

ในคำตอบมันเป็นการดีที่สุดที่จะเห็นตัวอย่างเฉพาะสำหรับปัญหาง่ายๆ ฉันเดาว่า "Hello World" ของอุปกรณ์D-Waveน่าจะเป็นอะไรบางอย่างที่เหมือนกับการค้นหาสถานะพื้นของแบบจำลอง 2D Ising ที่เรียบง่ายเนื่องจากนี่เป็นปัญหาประเภทหนึ่งที่ฮาร์ดแวร์ได้รับรู้โดยตรง บางทีนี่อาจเป็นตัวอย่างที่ดีในการดู แต่ถ้าผู้ที่มีความเชี่ยวชาญเป็นตัวอย่างทางเลือกจะเหมาะสมฉันยินดีที่จะเห็นทางเลือกอื่น

คำตอบ:


24

'Hello World' ที่เทียบเท่ากันในโลก D-Wave เป็นตัวอย่างตารางหมากรุกแบบ 2 มิติ ในตัวอย่างนี้คุณจะได้รับกราฟสี่เหลี่ยมต่อไปนี้ที่มี 4 โหนด:

                                                  square_graph

ให้กำหนดว่าเราสีจุดสุดยอดสีดำถ้าและสีขาวถ้า1 เป้าหมายคือการสร้างรูปแบบกระดานหมากรุกที่มีสี่จุดยอดในกราฟ มีหลายวิธีในการกำหนด และเพื่อให้ได้ผลลัพธ์นี้ ก่อนอื่นมีวิธีแก้ไขสองวิธีที่เป็นไปได้สำหรับปัญหานี้:σiσi=1σi=+1hJ

               checkerboard_solutions

ตัวลดควอนตัม D-Wave ช่วยลด Ising Hamiltonian ที่เรากำหนดไว้และเป็นสิ่งสำคัญที่จะต้องเข้าใจผลกระทบของการตั้งค่าตัวเชื่อมต่อต่างๆ ลองพิจารณาตัวอย่างตัวเชื่อมต่อ :J0,1

หากเราตั้งค่าเป็นค่า Hamiltonian จะลดลงถ้า qubits ทั้งสองใช้ค่าเดียวกัน เราบอกว่าเพลาเชิงลบความสัมพันธ์ ในขณะที่ถ้าเราตั้งค่าเป็น , Hamiltonian จะถูกย่อให้เล็กสุดถ้าสอง qubits รับค่าตรงข้าม ดังนั้นเพลาบวกต่อต้านความสัมพันธ์J0,1=1J0,1=+1

ในตัวอย่างตารางหมากฮอสเราต้องการต่อต้านความสัมพันธ์ของคู่ qubits ที่อยู่ใกล้เคียงซึ่งก่อให้เกิด Hamiltonian ต่อไปนี้:

H=σ0σ1+σ0σ2+σ1σ3+σ2σ3

เพื่อประโยชน์ในการสาธิตเรายังเพิ่มคำอคติบนควิบิตซึ่งเราได้ทางออกที่ 1 เท่านั้น วิธีการแก้ปัญหานี้ต้องและเราจึงตั้งอคติของ 1 มิลโตเนียนสุดท้ายคือตอนนี้:0σ0=1h0=1

H=σ0+σ0σ1+σ0σ2+σ1σ3+σ2σ3

ดังนั้นให้รหัสมันขึ้นมา!

หมายเหตุ: คุณจำเป็นต้องเข้าถึงบริการคลาวด์ของ D-Wave เพื่อให้ทุกอย่างทำงาน

ก่อนอื่นตรวจสอบให้แน่ใจว่าคุณได้ติดตั้งแพคเกจหลามdwave_sapi2( https://cloud.dwavesys.com/qubist/downloads/ ) ทุกอย่างจะเป็น Python 2.7 เนื่องจากปัจจุบัน D-Wave ไม่รองรับ Python เวอร์ชั่นที่สูงกว่า ที่ถูกกล่าวมาลองนำเข้าสิ่งจำเป็น:

from dwave_sapi2.core import solve_ising
from dwave_sapi2.embedding import find_embedding, embed_problem, unembed_answer
from dwave_sapi2.util import get_hardware_adjacency
from dwave_sapi2.remote import RemoteConnection

ในการเชื่อมต่อกับ D-Wave Solver API คุณจะต้องใช้โทเค็น API ที่ถูกต้องสำหรับตัวแก้ SAPI ของพวกเขา, URL ของ SAPI และคุณต้องตัดสินใจว่าต้องการใช้โปรเซสเซอร์ตัวใด

DWAVE_SAPI_URL = 'https://cloud.dwavesys.com/sapi'
DWAVE_TOKEN = [your D-Wave API token]
DWAVE_SOLVER = 'DW_2000Q_VFYC_1'

ฉันขอแนะนำให้ใช้ Chimera เสมือนจริงให้ผลตอบแทนเต็มที่กับ D-Wave 2000Q (VFYC) ซึ่งเป็นชิปที่ทำงานได้อย่างสมบูรณ์โดยไม่มี qubits ที่ตายแล้ว! นี่คือเค้าโครงชิป Chimera:

dwave_chimera

ณ จุดนี้ฉันแยกการสอนออกเป็นสองส่วน ในส่วนแรกเราจะฝังปัญหาด้วยตนเองลงในกราฟฮาร์ดแวร์ Chimera และในส่วนที่สองเราใช้การวิเคราะห์พฤติกรรมการฝังตัวของ D-Wave เพื่อค้นหาการฝังฮาร์ดแวร์

คู่มือการฝัง


เซลล์หน่วยที่มุมซ้ายบนของโครงร่างชิพ D-Wave 2000Q ด้านบนมีลักษณะดังนี้:

physical_qubits

โปรดทราบว่า couplers ทั้งหมดไม่สามารถมองเห็นได้ในภาพนี้ อย่างที่คุณเห็นไม่มีข้อต่อระหว่าง qubitและ qubitซึ่งเราจะต้องนำกราฟสแควร์ของเราไปใช้โดยตรง นั่นเป็นเหตุผลที่เรากำลังสร้างนิยามใหม่ , ,และ3จากนั้นเราจะดำเนินการต่อและกำหนดเป็นรายการและเป็นพจนานุกรม:0100142733hJ

J = {(0,4): 1, (4,3): 1, (3,7): 1, (7,0): 1}
h = [-1,0,0,0,0,0,0,0,0]

hมี 8 รายการตั้งแต่เราใช้ qubits 0 ถึง 7 ตอนนี้เราสร้างการเชื่อมต่อกับ Solver API และขอ D-Wave 2000Q VFYC Solver:

connection = RemoteConnection(DWAVE_SAPI_URL, DWAVE_TOKEN)
solver = connection.get_solver(DWAVE_SOLVER)

ตอนนี้เราสามารถกำหนดจำนวนการอ่านข้อมูลและเลือกanswer_modeให้เป็น "ฮิสโตแกรม" ซึ่งเรียงลำดับผลลัพธ์ตามจำนวนครั้งที่เกิดขึ้นกับเรา ตอนนี้เราพร้อมที่จะแก้ปัญหาอินสแตนซ์ Ising ด้วยเครื่องควอนตัม D-Wave:

params = {"answer_mode": 'histogram', "num_reads": 10000}
results = solve_ising(solver, h, J, **params)
print results

คุณควรได้ผลลัพธ์ดังนี้

{
  'timing': {
    'total_real_time': 1655206,
    'anneal_time_per_run': 20,
    'post_processing_overhead_time': 13588,
    'qpu_sampling_time': 1640000,
    'readout_time_per_run': 123,
    'qpu_delay_time_per_sample': 21,
    'qpu_anneal_time_per_sample': 20,
    'total_post_processing_time': 97081,
    'qpu_programming_time': 8748,
    'run_time_chip': 1640000,
    'qpu_access_time': 1655206,
    'qpu_readout_time_per_sample': 123
  },
  'energies': [-5.0],
  'num_occurrences': [10000],
  'solutions': [
      [1, 3, 3, 1, -1, 3, 3, -1, {
          lots of 3 's that I am omitting}]]}

ที่คุณสามารถดูเราได้พลังงานสภาพพื้นดินที่ถูกต้อง ( energies) ของ-5.0สตริงโซลูชันเต็มซึ่งเป็นผลลัพธ์เริ่มต้นสำหรับ qubits ที่ไม่ได้ใช้ / ไม่วัดและถ้าเราใช้การแปลงแบบย้อนกลับ - , ,และ - เราได้รับสตริงโซลูชันที่ถูกต้อง1] ทำ!5.0300417233[1,1,1,1]

ฮิวริสติกแบบฝัง


หากคุณเริ่มสร้างอินสแตนซ์ Ising ที่ใหญ่ขึ้นและใหญ่ขึ้นคุณจะไม่สามารถทำการฝังด้วยตนเองได้ ดังนั้นสมมติว่าเราไม่สามารถฝังตัวอย่างตารางหมากรุกของเราด้วยตนเองได้ และจากนั้นจะยังคงไม่เปลี่ยนแปลงจากคำจำกัดความเริ่มต้นของเรา:Jh

J = {(0,1): 1, (0,2): 1, (1,3): 1, (2,3): 1}
h = [-1,0,0,0]

เราสร้างการเชื่อมต่อระยะไกลอีกครั้งและรับอินสแตนซ์ตัวแก้ D-Wave 2000Q VFYC:

connection = RemoteConnection(DWAVE_SAPI_URL, DWAVE_TOKEN)
solver = connection.get_solver(DWAVE_SOLVER)

เพื่อหาการฝังปัญหาของเราเราต้องรับเมทริกซ์ adjacency ของกราฟฮาร์ดแวร์ปัจจุบัน:

adjacency = get_hardware_adjacency(solver)

ตอนนี้ลองหาการฝังปัญหาของเรา:

embedding = find_embedding(J.keys(), adjacency)

หากคุณกำลังจัดการกับอินสแตนซ์ Ising ขนาดใหญ่คุณอาจต้องการค้นหา embeddings ในหลายเธรด (ขนานกับหลาย CPU) จากนั้นเลือกการฝังด้วยความยาวสายที่เล็กที่สุด! ห่วงโซ่คือเมื่อหลาย qubits ถูกบังคับให้ทำหน้าที่เป็นคิวบิตเดียวเพื่อเพิ่มระดับของการเชื่อมต่อ อย่างไรก็ตามยิ่งห่วงโซ่ยาวยิ่งมีโอกาสมาก และโซ่ที่แตกจะให้ผลที่ไม่ดี!

ตอนนี้เราพร้อมที่จะฝังปัญหาของเราลงบนกราฟ:

[h, j0, jc, embeddings] = embed_problem(h, J, embedding, adjacency)

j0มีข้อต่อดั้งเดิมที่เรากำหนดและjcมีข้อต่อที่บังคับใช้ความสมบูรณ์ของโซ่ (พวกมันสัมพันธ์กับ qubits ภายในกลุ่ม) ดังนั้นเราต้องรวมมันอีกครั้งในพจนานุกรมเล่มใหญ่:J

J = j0.copy()
J.update(jc)

ตอนนี้เราพร้อมที่จะแก้ปัญหาที่ฝังตัวแล้ว:

params = {"answer_mode": 'histogram', "num_reads": 10000}
raw_results = solve_ising(solver, h, J, **params)

print 'Lowest energy found: {}'.format(raw_results['energies'])
print 'Number of occurences: {}'.format(raw_results['num_occurrences'])

raw_resultsจะไม่ทำให้รู้สึกถึงเราถ้าเรา unembed ปัญหา ในกรณีที่โซ่บางส่วนพังเราจะทำการแก้ไขผ่านการลงคะแนนเสียงส่วนใหญ่ตามที่กำหนดโดยอาร์กิวเมนต์ที่เป็นทางเลือกbroken_chains:

unembedded_results = unembed_answer(raw_results['solutions'],
                                    embedding, broken_chains='vote')

print 'Solution string: {}'.format(unembedded_results)

หากคุณทำสิ่งนี้คุณควรได้ผลลัพธ์ที่ถูกต้องในการอ่านค่าทั้งหมด:

Lowest energy found: [-5.0]
Number of occurences: [10000]
Solution string: [[1, -1, -1, 1]]

ฉันหวังว่านี้ตอบคำถามของคุณและฉันขอแนะนำให้ตรวจสอบจากทุกพารามิเตอร์เพิ่มเติมที่คุณสามารถส่งผ่านไปยังsolve_isingฟังก์ชั่นในการปรับปรุงคุณภาพของการแก้ปัญหาของคุณเช่นหรือnum_spin_reversal_transformspostprocess


9

เนื้อเรื่องของหัวเรื่องและคำถามดูเหมือนจะถามสองคำถามที่แตกต่างกัน ในชื่อเรื่องที่คุณถามว่า "คุณจะเขียนโปรแกรมอย่างง่ายสำหรับอุปกรณ์ D-Wave ได้อย่างไร" ในขณะที่อยู่ในส่วนคำถามคุณจะถามว่าจะหาสถานะพื้นฐานของแบบจำลอง 2D Ising ง่ายๆได้อย่างไรโดยใช้ฮาร์ดแวร์พื้นฐานของ D-Wave อุปกรณ์และสิ่งที่รหัสที่เกี่ยวข้องจะเป็น (ซึ่งเป็นคำถามที่เฉพาะเจาะจงมากขึ้น)

ฉันจะตอบคำถามก่อนเพราะมันเป็นคำถามทั่วไป

ตามหน้าซอฟต์แวร์ D-Wave :

ระบบ D-Wave 2000Q ให้บริการ Internet API มาตรฐาน (ตามบริการ RESTful) โดยมีไลบรารี่ไคลเอ็นต์สำหรับ C / C ++, Python และ MATLAB อินเทอร์เฟซนี้ช่วยให้ผู้ใช้สามารถเข้าถึงระบบไม่ว่าจะเป็นทรัพยากรคลาวด์บนเครือข่ายหรือรวมเข้ากับสภาพแวดล้อมและศูนย์ข้อมูลการคำนวณประสิทธิภาพสูง (HPC) การเข้าถึงยังมีให้ผ่านบริการคลาวด์ที่โฮสต์ของ D-Wave การใช้เครื่องมือพัฒนาและห้องสมุดลูกค้าของ D-Wave ผู้พัฒนาสามารถสร้างอัลกอริทึมและแอปพลิเคชันภายในสภาพแวดล้อมที่มีอยู่โดยใช้เครื่องมือมาตรฐานอุตสาหกรรม

ในขณะที่ผู้ใช้สามารถส่งปัญหาไปยังระบบได้หลายวิธี แต่ในที่สุดปัญหาก็คือชุดของค่าที่สอดคล้องกับน้ำหนักของ qubits และความแข็งแกร่งของข้อต่อ ระบบใช้ค่าเหล่านี้พร้อมกับพารามิเตอร์ที่ผู้ใช้ระบุอื่น ๆ และส่งคำสั่งเครื่องควอนตัมเดียว (QMI) ไปยัง QPU วิธีแก้ไขปัญหาสอดคล้องกับการกำหนดค่าที่เหมาะสมของ qubits ที่พบ นั่นคือจุดต่ำสุดในภูมิทัศน์พลังงาน ค่าเหล่านี้จะถูกส่งคืนไปยังโปรแกรมผู้ใช้ผ่านเครือข่าย

เนื่องจากคอมพิวเตอร์ควอนตัมมีความน่าจะเป็นมากกว่าการกำหนดค่าหลายค่าสามารถส่งคืนได้ซึ่งไม่เพียง แต่เป็นวิธีแก้ปัญหาที่ดีที่สุดเท่านั้น แต่ยังเป็นทางเลือกที่ดีอีกทางเลือกหนึ่ง ผู้ใช้สามารถระบุจำนวนโซลูชันที่ต้องการให้ระบบส่งคืน

ผู้ใช้สามารถส่งปัญหาไปยังคอมพิวเตอร์ควอนตัม D-Wave ได้หลายวิธี:

  1. การใช้โปรแกรมใน C, C ++, Python หรือ MATLAB เพื่อสร้างและดำเนินการ QMI
  2. การใช้เครื่องมือ D-Wave เช่น:

    • QSageนักแปลที่ออกแบบมาสำหรับปัญหาการเพิ่มประสิทธิภาพ

    • ToQผู้แปลภาษาระดับสูงใช้สำหรับปัญหาความพึงพอใจ จำกัด และออกแบบมาเพื่อให้ผู้ใช้“ พูด” ในภาษาของโดเมนปัญหาของพวกเขา

    • qbsolvซึ่งเป็นตัวแก้ปัญหาการเพิ่มประสิทธิภาพการแบ่งพาร์ติชันแบบโอเพนซอร์ซโอเพนซอร์ซสำหรับปัญหาที่มีขนาดใหญ่กว่าจะเหมาะสมกับ QPU Qbsolv สามารถ
      ดาวน์โหลดได้ที่นี่

    • dwซึ่งดำเนินการ QMI ที่สร้างขึ้นผ่านโปรแกรมแก้ไขข้อความ

  3. โดยการตั้งโปรแกรมระบบโดยตรงผ่าน QMIs

ดาวน์โหลดเอกสารข้อมูลนี้เพื่อเรียนรู้เพิ่มเติมเกี่ยวกับรูปแบบการเขียนโปรแกรมสำหรับระบบ D-Wave


5

อินพุตไปยัง D-Wave เป็นรายการของการโต้ตอบและเมื่อเร็ว ๆ นี้เวลาหลอมของ qubits

ดังที่คุณกล่าวถึงปัญหา Ising เป็นหนึ่งในวิธีที่ง่ายที่สุดในในปัญหาของ Hamiltonian แต่ก็ไม่น่าสนใจมากJij=1

ฉันแนะนำภาคผนวกในบทความนี้สำหรับคำอธิบายโดยย่อเกี่ยวกับวิธีการทำงานของฮาร์ดแวร์ D-Wave (การเปิดเผยอย่างเต็มรูปแบบ: ฉันเป็นผู้เขียนร่วม)


2
มันอาจจะดีกว่านี้ถ้าคุณใส่คำตอบส่วนใหญ่ไว้ที่นี่แทนที่จะใส่ในลิงค์? การเป็นผู้เขียนร่วมในบทความคุณอาจเหมาะสมที่สุดที่จะทำบทสรุปที่ดี
agaitaarino
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.