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 sepertimypyakan menandai menambahkan atribut baru keregistrydengan 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: ignoreuntukmypy) 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_strMuat 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_strMuat 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_bytesSerialisasi 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_bytesMuat 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_diskSerialisasi 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_diskMuat 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.copyMenyalin 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 . |