Ustalenia techniczne
Na jakim systemie są sprawdzane zadania?
- Wszystkie zadania są sprawdzane na systemie Linux z dystrybucją Ubuntu. O ile w danym zadaniu nie zostało zaznaczone inaczej, korzystamy z Pythona 3.12.3.
Jak wygląda proces sprawdzania zadań?
- Twój kod jest uruchamiany w odizolowanym od reszty SprawdzAI systemie o ograniczonych uprawnieniach. Wewnątrz niego możesz dowolnie tworzyć i edytować pliki (np. tworzyć pliki tymczasowe w
/tmp
lub pliki z odpowiedziami w folderze notatnika). Sprawdzenie zadania składa się z dwóch faz - uruchomienia wszystkich komórek notatnika, a następnie uruchomienia kodu sprawdzającego. W zgłoszeniu są one widoczne kolejno jako "uruchamianie" oraz "ewaluowanie". Te dwie fazy są od siebie całkowicie odseparowane, tzn. pliki stworzone podczas uruchomienia notatnika czy zmiany środowiska nie będą zachowane później. Kod sprawdzający może, w zależności od zadania, liczyć metryki na wygenerowanych plikach bądź też uruchamiać pliki cloudpickle
stworzone przez notatnik.Po co są dwie fazy? Czemu muszę zapisywać plik cloudpickle który zostanie osobno uruchomiony?
- Standardowo faza uruchomienia notatnika ma dostęp tylko do danych treningowych (tych, które użytkownicy i tak mają bezpośrednio dostępne podczas rozwiązywania zadania), a dane walidacyjne lub testowe zostają przekazane dopiero do pickla który został już przygotowany lub wytrenowany w notatniku. Dzięki temu możemy dawać wszystkie logi z uruchomienia notatnika (
stdout
i stderr
), a ograniczenia na ich długość wynikają jedynie z tego, że nie chcielibyśmy, aby ktoś zapchał nasz dysk poprzez wypisywanie nadmiernej ilości znaków na te strumienie. Z kolei logi z uruchomienia pliku cloudpickle
są już mocno ograniczone. Dzięki temu, użytkownicy otrzymują maksymalnie dużo informacji przydatnych do debugowania kodu, a my nie ryzykujemy wycieknięciem naszych danych testowych, co jest szczególnie istotne podczas konkursów. Sprawia to jednak, że debugowanie błędów które pojawiły się w trakcie fazy ewaluacji (wewnątrz funkcji z cloudpickle
) może być znacznie trudniejsze, bo nie zawsze otrzymasz tak samo precyzyjne informacje jak przy uruchomieniu notatnika.Dlaczego faza przygotowywania trwa czasem tak długo?
- W trakcie tej fazy system przygotowuje wszystkie pliki oraz całe środowisko, aby później w żaden sposób nie musieć zakłócać uruchamiania, dzięki czemu długości trwania kolejnych faz są wiarygodne i sprawiedliwe. Długość trwania tej fazy na ogół nie zależy od Twojego zgłoszenia. Nie należy się więc martwić, jeśli czasem trwa ona dłużej niż zwykle. Cały czas dokładamy wszelkich starań, aby była ona tak krótka, jak to tylko możliwe.
Zgłoszenie otrzymało punkty, mimo że uruchomienie notatnika wywołało błąd. Dlaczego?
- Po rozpoczęciu uruchamiania wszystkich komórek notatnika, nasz system nie interesuje się już co dokładnie w trakcie uruchamiania się stanie. W szczególności, jeśli uruchomienie notatnika zakończy się błędem, ale wszystkie oceniane pliki zdążą się zapisać, to i tak zostaną przyznane punkty za zadanie.
Czy to samo zgłoszenie może otrzymywać różne długości wykonania?
- Ze względu na liczne czynniki, nawet zgłoszenie nie zawierające żadnej losowości wysłane kilka razy może otrzymywać czasy wykonania różne o około 3 sekundy w przypadku długich czasów uruchomienia.
Na jakim procesorze uruchamiane są zadania?
- Aktualnie używamy procesora AMD EPYC 7402. W każdym zadaniu dostępne są 4 kory CPU.
Dlaczego całkowity VRAM karty graficznej jest większy niż ten podany w zadaniu?
- Limit VRAM działa poprzez zaalokowanie na osobnym procesie pamięci o wielkości równej różnicy między całkowitą pamięcią GPU a oczekiwanym limitem. Dla przykładu, jeśli karta posiada 40GB VRAM, a chcemy mieć limit 24GB, to zostanie odgórnie zaalokowane 16GB aby limit był spełniony. Dlatego z poziomu kodu całkowita ilość pamięci to nadal będzie 40GB a nie 24GB.
Jak wygląda struktura plików w SprawdzAI? Jak jest uruchamiany notatnik?
- Wszystkie Twoje pliki zgłoszeniowe jak i pliki zbiorów danych wspomniane w danym zadaniu znajdują się w folderze
/sandbox
. Z tamtąd jest też uruchamiana komenda python -u /sandbox/submission.py
(flaga -u
jest dodana, aby poprawnie pokazywać wyjście notatnika w przypadkach przekroczenia limitu pamięci czy czasu). Środowisko Python znajduje się w /venv
i jest dodane na PATH
. Linie twojego notatnika o postaci {wcięcie}!{komenda}
zostaną zamienione na:
{wcięcie}__import__('subprocess').run({komenda}, shell=True, check=True)