confection
? adalah perpustakaan ringan yang menawarkan sistem konfigurasi yang memungkinkan Anda menggambarkan pohon objek yang sewenang -wenang.
Konfigurasi adalah tantangan besar untuk kode pembelajaran mesin karena Anda mungkin ingin mengekspos hampir semua detail fungsi apa pun sebagai hiperparameter. Pengaturan yang ingin Anda ungkapkan mungkin secara sewenang -wenang jauh di dalam tumpukan panggilan Anda, jadi mungkin perlu melewati semua jalan melalui CLI atau REST API, melalui sejumlah fungsi perantara, mempengaruhi antarmuka segala sesuatu di sepanjang jalan. Dan setelah pengaturan tersebut ditambahkan, mereka menjadi sulit untuk dihapus nanti. Nilai default juga menjadi sulit untuk diubah tanpa melanggar kompatibilitas ke belakang.
Untuk mengatasi masalah ini, confection
menawarkan sistem konfigurasi yang memungkinkan Anda dengan mudah menggambarkan pohon objek yang sewenang -wenang. Objek dapat dibuat melalui panggilan fungsi yang Anda daftarkan menggunakan sintaks dekorator sederhana. Anda bahkan dapat versi fungsi yang Anda buat, memungkinkan Anda untuk melakukan perbaikan tanpa melanggar kompatibilitas ke belakang. Sistem konfigurasi paling mirip yang kami ketahui adalah Gin, yang menggunakan sintaks yang serupa, dan juga memungkinkan Anda untuk menautkan sistem konfigurasi ke fungsi dalam kode Anda menggunakan dekorator. Sistem konfigurasi confection
lebih sederhana dan menekankan alur kerja yang berbeda melalui subset fungsionalitas gin.
Pip Pasang konpeksi
conda instal -c conda -forge konpeksi
Sistem konfigurasi mem -parsing file .cfg
seperti
[Pelatihan] Kesabaran = 10Dropout = 0.2USE_VECTORS = false [pelatihan.logging] level = "info" [nlp]# Ini menggunakan nilai pelatihan.use_vectorsuse_vectors = $ {pelatihan.use_vectors} lang = "en"
dan menyelesaikannya menjadi Dict
:
{"Pelatihan": {"Patience": 10, "Dropout": 0.2, "use_vectors": false, "logging": {"level": "info"} }, "nlp": {"use_vectors": false, "lang": "en" } }
Konfigurasi dibagi menjadi beberapa bagian, dengan nama bagian dalam tanda kurung persegi - misalnya, [training]
. Di dalam bagian, nilai konfigurasi dapat ditetapkan untuk kunci menggunakan =
. Nilai juga dapat dirujuk dari bagian lain menggunakan notasi titik dan placeholder yang ditunjukkan oleh tanda dolar dan kawat gigi keriting. Misalnya, ${training.use_vectors}
akan menerima nilai use_vectors di blok pelatihan. Ini berguna untuk pengaturan yang dibagikan di seluruh komponen.
Format konfigurasi memiliki tiga perbedaan utama dari configparser
bawaan Python:
Nilai yang diformat JSON. confection
melewati semua nilai melalui json.loads
Muat untuk menafsirkannya. Anda dapat menggunakan nilai atom seperti string, pelampung, bilangan bulat atau boolean, atau Anda dapat menggunakan objek kompleks seperti daftar atau peta.
Bagian terstruktur. confection
menggunakan notasi titik untuk membangun bagian bersarang. Jika Anda confection
bagian bernama [section.subsection]
Referensi ke fungsi registri. Jika kunci dimulai dengan @
, confection
akan menafsirkan nilainya sebagai nama registri fungsi, muat fungsi yang terdaftar untuk nama itu dan lulus di seluruh blok sebagai argumen. Jika petunjuk tipe tersedia pada fungsi, nilai argumen (dan nilai pengembalian fungsi) akan divalidasi terhadapnya. Ini memungkinkan Anda mengekspresikan konfigurasi yang kompleks, seperti pipa pelatihan di mana batch_size
diisi oleh fungsi yang menghasilkan mengapung.
Tidak ada skema yang telah ditentukan sebelumnya yang harus Anda ikuti; Bagaimana Anda mengatur bagian tingkat atas terserah Anda. Pada akhirnya, Anda akan menerima kamus dengan nilai -nilai yang dapat Anda gunakan dalam skrip Anda - apakah itu fungsi inisialisasi lengkap, atau hanya pengaturan dasar.
Misalnya, katakanlah Anda ingin mendefinisikan pengoptimal baru. Anda akan mendefinisikan argumennya di config.cfg
seperti itu:
[pengoptimal] @optimizers = "my_cool_optimizer.v1" learn_rate = 0,001gamma = 1e-8
Untuk memuat dan menguraikan konfigurasi ini menggunakan registri catalogue
(instal catalogue
secara terpisah):
Impor Dataclass dari Union Pengetikan Impor, IterableMport Cataloguefrom Impor Registry Impor, Config# Buat registry.registry.optimizers = Catalogue.create ("konpeksi", "optimizers", entri_points = false)# yang ditentukan [email protected]. MyCoolopTimizer: learn_rate: floatgamma: [email protected] ("my_cool_optimizer.v1") def make_my_optimizer (learn_rate: union [float, iterable [float]], gamma: float): return mycooloptimizer (learn_rate, gamma)# muat file konfigur itu dan ambil objek pengoptimal instantiated.config = Config (). From_disk ("./ config.cfg") diselesaikan = registry.resolve (config) optimizer = diselesaikan ["optimizer"] # mycooloptimizer (learn_rate = 0,001, gamma = 1E-08)
️ PERHATIAN: Jenis -pengecek sepertimypy
akan menandai menambahkan atribut baru keregistry
dengan cara ini - yaituregistry.new_attr = ...
- sebagai kesalahan. Ini karena atribut baru ditambahkan ke kelas setelah inisialisasi. Jika Anda menggunakan Tycecheckers, Anda dapat mengabaikan ini (misalnya dengan# type: ignore
untukmypy
) atau gunakan alternatif typeafe: alih -alihregistry.new_attr = ...
, gunakansetattr(registry, "new_attr", ...)
.
Di bawah kap, confection
akan mencari fungsi "my_cool_optimizer.v1"
dalam registri "pengoptimal" dan kemudian menyebutnya dengan argumen learn_rate
dan gamma
. Jika fungsi memiliki jenis anotasi, itu juga akan memvalidasi input. Misalnya, jika learn_rate
dijelaskan sebagai float dan konfigurasi mendefinisikan string, confection
akan menimbulkan kesalahan.
Dokumentasi Thinc menawarkan informasi lebih lanjut tentang sistem konfigurasi:
blok rekursif
mendefinisikan argumen posisi variabel
menggunakan interpolasi
menggunakan pendaftar khusus
Anotasi Jenis Lanjutan dengan Pydantic
menggunakan skema dasar
Mengisi konfigurasi dengan default
Config
Kelas Kelas ini memegang konfigurasi model dan pelatihan dan dapat memuat dan menyimpan format konfigurasi-gaya-gaya dari/ke string, file atau byte. Kelas Config
adalah subclass dari dict
dan menggunakan ConfigParser
Python di bawah kap.
Config.__init__
Inisialisasi objek Config
baru dengan data opsional.
dari konfeksi impor configConfig = config ({"pelatihan": {"sabar": 10, "dropout": 0.2}})
Argumen | Jenis | Keterangan |
---|---|---|
data | Optional[Union[Dict[str, Any], Config]] | Data opsional untuk menginisialisasi konfigurasi dengan. |
section_order | Optional[List[str]] | Nama-nama bagian tingkat atas, secara berurutan, digunakan untuk mengurutkan konfigurasi yang disimpan dan dimuat. Semua bagian lainnya akan diurutkan secara abjad. |
is_interpolated | Optional[bool] | Apakah konfigurasi diinterpolasi atau apakah mengandung variabel. Baca dari data jika ini adalah instance dari Config dan default ke True . |
Config.from_str
Muat konfigurasi dari string.
dari konfeksi impor configconfig_str = "" "[pelatihan] sabar = 10dropout = 0,2" "" "config = config (). from_str (config_str) cetak (config [" pelatihan "]) # {'Patience': 10, 'dropout': 0.2}}
Argumen | Jenis | Keterangan |
---|---|---|
text | str | Konfigurasi string untuk dimuat. |
interpolate | bool | Apakah akan menginterpolasi variabel seperti ${section.key} . Default ke True . |
overrides | Dict[str, Any] | Menimpa nilai dan bagian. Kunci disediakan dalam notasi titik, misalnya "training.dropout" . |
Kembali | Config | Konfigurasi yang dimuat. |
Config.to_str
Muat konfigurasi dari string.
dari konfeksi impor configConfig = config ({"pelatihan": {"sabar": 10, "dropout": 0.2}}) cetak (config.to_str ()) # '[pelatihan] npatience = 10nndropout = 0.2'
Argumen | Jenis | Keterangan |
---|---|---|
interpolate | bool | Apakah akan menginterpolasi variabel seperti ${section.key} . Default ke True . |
Kembali | str | Konfigurasi String. |
Config.to_bytes
Serialisasi konfigurasi ke string byte.
dari konpeksi impor configConfig = config ({"pelatihan": {"sabar": 10, "dropout": 0.2}}) config_bytes = config.to_bytes () cetak (config_bytes) # b '[pelatihan] npatience = 10nndropout = 0.2'
Argumen | Jenis | Keterangan |
---|---|---|
interpolate | bool | Apakah akan menginterpolasi variabel seperti ${section.key} . Default ke True . |
overrides | Dict[str, Any] | Menimpa nilai dan bagian. Kunci disediakan dalam notasi titik, misalnya "training.dropout" . |
Kembali | str | Konfigurasi serial. |
Config.from_bytes
Muat konfigurasi dari string byte.
dari konfeksi impor configConfig = config ({"pelatihan": {"sabar": 10, "dropout": 0.2}}) config_bytes = config.to_bytes () new_config = config (). from_bytes (config_bytes)
Argumen | Jenis | Keterangan |
---|---|---|
bytes_data | bool | Data untuk dimuat. |
interpolate | bool | Apakah akan menginterpolasi variabel seperti ${section.key} . Default ke True . |
Kembali | Config | Konfigurasi yang dimuat. |
Config.to_disk
Serialisasi konfigurasi ke file.
dari konfeksi impor configConfig = config ({"pelatihan": {"sabar": 10, "dropout": 0.2}}) config.to_disk ("./ config.cfg")
Argumen | Jenis | Keterangan |
---|---|---|
path | Union[Path, str] | Jalur file. |
interpolate | bool | Apakah akan menginterpolasi variabel seperti ${section.key} . Default ke True . |
Config.from_disk
Muat konfigurasi dari file.
dari konfeksi impor configConfig = config ({"pelatihan": {"sabar": 10, "dropout": 0.2}}) config.to_disk ("./ config.cfg") new_config = config (). from_disk (" config.cfg ")
Argumen | Jenis | Keterangan |
---|---|---|
path | Union[Path, str] | Jalur file. |
interpolate | bool | Apakah akan menginterpolasi variabel seperti ${section.key} . Default ke True . |
overrides | Dict[str, Any] | Menimpa nilai dan bagian. Kunci disediakan dalam notasi titik, misalnya "training.dropout" . |
Kembali | Config | Konfigurasi yang dimuat. |
Config.copy
Menyalin ke dalam konfigurasi.
Argumen | Jenis | Keterangan |
---|---|---|
Kembali | Config | Konfigurasi yang disalin. |
Config.interpolate
Variabel interpolat seperti ${section.value}
atau ${section.subsection}
dan mengembalikan salinan konfigurasi dengan nilai yang diinterpolasi. Dapat digunakan jika konfigurasi dimuat dengan interpolate=False
, misalnya melalui Config.from_str
.
Dari Confection Import configConfig_str = "" "[hyper_params] dropout = 0,2 [pelatihan] dropout = $ {hyper_params.dropout}" "" config = config (). from_str (config_str, interpolate = false) cetak (config ["pelatihan"] ) # {'dropout': '$ {hyper_params.dropout}'}} config = config.interpolate () print (config ["training"]) # {'dropout': 0.2}}
Argumen | Jenis | Keterangan |
---|---|---|
Kembali | Config | Salinan konfigurasi dengan nilai interpolasi. |
Config.merge
Deep-Merge Two Config Objects, menggunakan konfigurasi saat ini sebagai default. Hanya menggabungkan bagian dan kamus dan bukan nilai -nilai lain seperti daftar. Nilai yang disediakan dalam pembaruan ditimpa dalam konfigurasi dasar, dan nilai atau bagian baru ditambahkan. Jika nilai konfigurasi adalah variabel seperti ${section.key}
(misalnya jika konfigurasi dimuat dengan interpolate=False)
, variabel lebih disukai , bahkan jika pembaruan memberikan nilai yang berbeda. Ini memastikan bahwa referensi variabel tidak dihancurkan oleh penggabungan.
️ Perhatikan bahwa blok yang merujuk pada fungsi terdaftar menggunakan@
sintaks hanya digabungkan jika mereka mengacu pada fungsi yang sama. Jika tidak, penggabungan dapat dengan mudah menghasilkan konfigurasi yang tidak valid, karena fungsi yang berbeda dapat mengambil argumen yang berbeda. Jika blok mengacu pada fungsi yang berbeda, itu ditimpa.
Dari Konpeksi Impor configbase_config_str = "" "[pelatihan] Patience = 10dropout = 0.2" "" update_config_str = "" "[pelatihan] dropout = 0.1max_epochs = 2000" "" base_config = config (). from_str (base_config_str) update_config = configor = config (). from_str (base_config_str) (baseconfig = config (). From_stre. ) .from_str (update_config_str) gabungan = Config (base_config) .merge (update_config) cetak (gabungan ["pelatihan"]) # {'kesabaran': 10, 'dropout': 0.1, 'max_epochs': 2000}
Argumen | Jenis | Keterangan |
---|---|---|
overrides | Union[Dict[str, Any], Config] | Pembaruan untuk bergabung ke dalam konfigurasi. |
Kembali | Config | Contoh konfigurasi baru yang berisi konfigurasi gabungan. |
Argumen | Jenis | Keterangan |
---|---|---|
is_interpolated | bool | Apakah nilai konfigurasi telah diinterpolasi. Default ke True dan diatur ke False jika konfigurasi dimuat dengan interpolate=False , misalnya menggunakan Config.from_str . |