Přeskočit na hlavní obsah

Pochop zásadní změny v balíčcích Qiskit v1.0

Qiskit v1.0 používá jinou strukturu balíčků než předchozí verze Qisku a pravděpodobně způsobí problémy v prostředích, která využívají balíčky, jež nejsou na Qiskit v1.0 připraveny.

pozor

Nepokoušej se upgradovat stávající Python virtuální prostředí na Qiskit v1.0 přímo na místě.

Podobné zásadní změny balíčků v budoucnu nebudeme provádět. Jde o jednorázovou událost spojenou s vydáním Qiskit v1.0, a to právě proto, aby bylo zacházení s balíčky v budoucnu co nejjednodušší.

Tato stránka obsahuje podrobné informace o balíčku Qiskit před verzí 1.0 a o důvodech, proč jsme přistoupili ke zmiňovaným zásadním změnám balíčků.

Víme, že tato změna je nepohodlná, ale obnovuje jednoduchý strukturu balíčků, jakou používá většina Python balíčků — a ta bude po dokončení přechodu na Qiskit v1.0 snadnější pro uživatele, vývojáře i autory knihoven.

Předmluva: slovníček terminologie Python balíčků

Abychom lépe vysvětlili, jak byl starý Qiskit metabalíček strukturován a jak se to změnilo s vydáním Qiskit v1.0, uvádíme níže slovníček běžně používaného žargonu z oblasti Python balíčků. Následující pojmy mají v tomto dokumentu konkrétní význam.

Klikni sem a přečti si slovníček této stránky
  • modul: Jediný Python soubor.

  • balíček: Adresář obsahující __init__.py a další soubory nebo balíčky, které Python umí načíst. Jde o skutečný kód nainstalovaný na tvém počítači, a je to to, co se spustí při import something. Python považuje za importovatelné každé adresáře na vyhledávací cestě (a importuje i mnoho dalších položek).

    Nejde o stejný objekt, který pip installuješ (to je distribuce), ale název toho, co pip installuješ, a toho, co importuješ, jsou obvykle stejné.

  • submodul, subbalíček: Jde o nepřesné termíny, ale jsou běžně používané. Předpona sub znamená „obsažený uvnitř balíčku". Submodul je modul a subbalíček je balíček, ale oba jsou součástí většího balíčku.

  • jmenný balíček (namespace package): Balíček, do kterého mohou jiné distribuce instalovat submoduly nebo subbalíčky. Klíčové je, že žádná distribuce přispívající do jmenného balíčku nemusí nutně vlastnit všechny nainstalované soubory, takže jeho úplné odinstalování nebo upgrade může být ošemetné.

  • distribuce: Komprimované Python soubory, datové soubory a metadata, která se stáhnou při pip install something. Distribuce obvykle obsahuje přesně jeden balíček a metadata o způsobu jeho instalace (požadavky a podobně), ale není to povinné. Distribuce může obsahovat nula nebo více modulů či balíčků.

    Pokud znáš „správce balíčků" mimo kontext Pythonu, například apt z Debianu/Ubuntu nebo Homebrew na macOS, pak to, čemu oni říkají „balíček", Python nazývá distribucí, a pro to, čemu Python říká balíček, u nich neexistuje přesný ekvivalent.

    Většina zdrojů pojednávajících o balíčcích v Pythonu používá termín balíček pro distribuce i pro balíčky zároveň, a musíš se řídit kontextem. Obecně platí: pokud to importuješ, zdroj myslí „balíček", a pokud to pip installuješ, zdroj myslí „distribuce".

  • vyhledávací cesta (search path): Při pokusu o import something Python prohledává předdefinovaný seznam míst, kde hledá modul nebo balíček nazvaný something. Tento seznam míst je vyhledávací cesta. Vyhledávací cestu můžeš zobrazit a upravit pomocí sys.path.

  • požadavek (requirement): Distribuce obsahuje informace o jiných distribucích, na nichž závisí. Každá distribuce, která je nezbytná, je požadavek, a správce balíčků (obvykle pip nebo conda) by měl zajistit, aby byly všechny požadavky nainstalovány v kompatibilních verzích.

Python je vysoce dynamický a mohou vznikat různé komplikace; například modul nebo balíček nemusí odpovídat souborům na disku, nebo mohou být kompilovanými rozšířeními.

Vyhledávací cesta není pouze prohledávání adresářů, ale pro tuto diskusi jsou relevantní pouze soubory na disku. Další komplikace nejsou nutné k pochopení problémů popsaných v této části, takže ti stačí výše popsaný model.

Stará struktura Qisku

Historicky byl Qiskit tvořen mnoha Python distribucemi: qiskit-terra, jádro kompilátoru; qiskit-aer, vysoce výkonný simulátor; původní IBM Quantum® provider; a několik dnes zastaralých balíčků poskytujících konkrétní průzkumné algoritmické funkce nebo funkce pro spouštění experimentů. Pro pohodlí uživatelů jsme také poskytovali Python distribuci nazvanou qiskit, která neobsahovala žádný vlastní kód, ale způsobila instalaci všech ostatních komponent. Tuto distribuci jsme nazvali metabalíček, po analogii s podobnými koncepty v jiných správcích balíčků. Kód jádra Qisku žil v qiskit-terra, který vlastnil kořen Python balíčku qiskit. Jinými slovy, qiskit-terra kontroloval, co se stane při import qiskit. Do verze Qiskit v1.0 byl balíček qiskit jmenným balíčkem a obsahoval druhý jmenný balíček na qiskit.providers.

Tato organizace způsobila nám i našim uživatelům celou řadu problémů.

Například downstream knihovny závislé na Qisku často ve skutečnosti potřebovaly pouze jádro kompilátoru a nevyžadovaly zbytek rozsáhlého ekosystému, který přicházel s pip install qiskit. Proto správně uváděly svůj požadavek jako qiskit-terra. Když se ale lidé pokoušeli odinstalovat Qiskit příkazem pip uninstall qiskit, pip narážel na problémy:

  • pip neodstraňuje distribuce, které jsou nyní nevyužité. Takže pip uninstall qiskit neudělal téměř nic — v distribuci nebyl žádný kód, takže žádný kód nebyl odstraněn.
  • I kdyby kód odstranil, mnoho downstream distribucí by zůstalo nainstalovaných, protože závisely na qiskit-terra.
  • I kdybychom odinstalovali qiskit-terra, mohl by stále zůstat importovatelný adresář qiskit bez použitelného kódu, protože šlo o jmenný balíček.

Při instalaci nebo upgradu distribucí příkazem pip install pip také nebere v úvahu předchozí řešení požadavků. Protože existovaly dva balíčky, upgrade balíčku vyžadujícího upgrade qiskit-terra způsobil neplatné prostředí; pip upgradoval qiskit-terra, ale qiskit nechal beze změny. Vydával varování při tomto i všech následujících příkazech pip install, ale protože se nic nezdálo být rozbité, uživatelé varování obvykle ignorovali a pip nevyhodil chybový stav ani nezakázal operace.

Postupem času jsme odstraňovali prvky z metabalíčku qiskit, až začínaje Qiskit v0.44 zbyl pouze qiskit-terra. Z těchto komponent qiskit-aer stále existuje a je aktivně aktualizován, ale nyní se instaluje jako samostatná distribuce.

Podobně jsme stále důrazněji nedoporučovali ostatním knihovnám používat háčky jmenného prostoru. Poslední použití těchto háčků v nekterých zastaralých balíčcích jsme odstranili s vydáním Qiskit Aer v0.11 a jeho novým Python balíčkem qiskit_aer, ačkoli jsme až do Qiskit v1.0 také vynucovali funkčnost cesty jmenného prostoru qiskit.providers.aer. Počínaje Qiskit v1.0 jsme odebrali možnost rozšiřovat jakýkoli jmenný prostor qiskit. Díky tomu pip uninstall správné distribuce v platném prostředí nyní funguje podle očekávání.

Nová struktura Qisku

Počínaje verzí 1.0 tvoří Qiskit jediná distribuce nazvaná qiskit, která instaluje jeden balíček, taktéž nazvaný qiskit, jenž vlastní veškerý kód obsažený ve svém adresáři. Jde o normální strukturu Python kódu — nejjednodušší a nejméně chybovou.

Distribuce qiskit-terra na PyPI nikdy nebude aktualizována na verzi 1.0 nebo vyšší; plně ji nahrazuje qiskit. Název qiskit-terra již není součástí instalace. Balíček qiskit-terra však není odstraňován z PyPI a jeho nejnovější verzi ponecháme v funkčním stavu, aby starý vědecký kód a starší balíčky mohly snadněji pokračovat v jeho používání.

Bohužel, kvůli dědictví metabalíčku a nedostatkům pip jakožto správce balíčků, není v našich silách zajistit plynulý přechod uživatelů na Qiskit v1.0 — zejména dokud část balíčků závisí na starších verzích Qisku a jiné vyžadují pouze Qiskit v1.0+. Tyto problémy se zmírní, jak bude více ekosystému migrovat na Qiskit v1.0.

Kam se poděly aplikační moduly?

Možná si všimneš, že příkaz pip install qiskit již neobsahuje balíčky jako qiskit-aer nebo qiskit-nature. S odstraněním struktury metabalíčku byly mnohé z těchto balíčků rozděleny do distribucí, které je nutné instalovat samostatně.

Před vydáním Qiskit SDK v1.0 byl Qiskit tvořen mnoha různými Python distribucemi, jako například qiskit-terra, jádro kompilátoru; qiskit-aer, vysoce výkonný simulátor; původní IBM Quantum® provider; a několik dnes zastaralých balíčků poskytujících konkrétní průzkumné algoritmické funkce nebo funkce pro spouštění experimentů.

Pokud chceš nainstalovat balíčky, které byly dříve součástí metabalíčku Qiskit, navštiv ekosystém Qiskit a najdi celou řadu balíčků, které vyhoví tvým potřebám. Můžeš si také přečíst průvodce migrací na v1.0 a získat více informací o tom, jak nainstalovat novou distribuci.