Xin chân thành cảm ơn Brian Granger, Fernando Pérez và Robert Kern vì những đóng góp cho bài viết này!
Đối với người học cũng như các nhà khoa học dữ liệu giàu kinh nghiệm, Jupyter Notebook là một trong những công cụ khoa học dữ liệu phổ biến: môi trường tương tác không chỉ lý tưởng để dạy và học, chia sẻ công việc với đồng nghiệp, mà còn đảm bảo tính tái lập nghiên cứu. Tuy nhiên, khi bạn đang khám phá cách làm việc với notebook này, bạn sẽ thường xuyên bắt gặp IPython.
Ở một số trường hợp, hai cái tên này dường như là từ đồng nghĩa và bạn sẽ đồng ý với tôi rằng điều này khá rối rắm khi bạn muốn tìm hiểu sâu hơn: các “magic” thuộc về Jupyter hay IPython? Việc lưu và tải notebook là tính năng của IPython hay Jupyter?
Bạn có thể tiếp tục đặt ra vô số câu hỏi.
Bài đăng hôm nay nhằm minh họa rõ ràng hơn một số khác biệt cốt lõi giữa hai công cụ, không chỉ bắt đầu từ nguồn gốc của cả hai để giải thích mối liên hệ giữa chúng, mà còn đề cập đến một số tính năng cụ thể thuộc về từng bên, để bạn dễ dàng phân biệt hơn!
Bạn cũng nên đọc Hướng dẫn Toàn diện về Jupyter Notebook của DataCamp để biết mẹo và thủ thuật, thực hành tốt, ví dụ và nhiều hơn nữa.
Nguồn gốc của IPython / Jupyter
Để hiểu đầy đủ Jupyter Notebook là gì và nó khác gì với IPython, có lẽ sẽ hữu ích khi đọc đôi chút về việc hai công cụ này nằm ở đâu trong lịch sử và tương lai của các notebook tính toán.
Khởi đầu của Notebook tính toán: MATLAB, Mathematica & Maple
Giữa thập niên 1980, MATLAB được phát hành bởi The MathWorks, do Jack Little, Steve Bangert và Cleve Moler sáng lập.
Tiến đến cuối thập niên 1980, chính xác là năm 1987. Theodore Gray bắt đầu làm việc trên phần giao diện notebook của Mathematica và một năm sau, sản phẩm được phát hành rộng rãi. Giao diện đồ họa cho phép tạo và chỉnh sửa tương tác các tài liệu notebook chứa mã chương trình được trình bày đẹp mắt, văn bản được định dạng và hàng loạt tính năng như công thức toán học, đồ họa, thành phần GUI, bảng và âm thanh. Các khả năng xử lý văn bản tiêu chuẩn cũng có, như kiểm tra chính tả đa ngôn ngữ theo thời gian thực. Bạn có thể xuất tài liệu sang chế độ trình chiếu để thuyết trình.
Khi xem cấu trúc của các notebook này, bạn sẽ nhận ra ngay rằng chúng phụ thuộc vào hệ thống phân cấp các ô (cell) cho phép phác thảo và chia mục tài liệu — điều mà bạn cũng thấy trong các Jupyter notebook ngày nay.
Cũng vào cuối thập niên 1980, năm 1989, Maple giới thiệu giao diện GUI kiểu notebook đầu tiên. Nó được bao gồm trong phiên bản 4.3 cho Macintosh. Phiên bản cho X11 và Windows ra mắt năm 1990. Những notebook thời kỳ đầu này đã truyền cảm hứng và đặt nền tảng để người khác phát triển cái sau này được gọi là “data science notebooks”.
Sự trỗi dậy của Data Science Notebook
Sau các notebook của Maple và Mathematica, nhiều notebook tính toán khác đã ra đời. Tuy nhiên, phần này sẽ tập trung vào những notebook góp phần làm bùng nổ data science notebooks. Bạn sẽ thấy một số notebook trong đó vẫn rất phổ biến với cả người học lẫn nhà khoa học dữ liệu dày dạn.
Sage Notebook
Sage notebook, dưới dạng hệ thống chạy trên trình duyệt, được phát hành lần đầu vào giữa những năm 2000 và đến năm 2007, một phiên bản mới mạnh mẽ hơn ra mắt, có tài khoản người dùng và có thể dùng để công khai tài liệu. Nó giống giao diện Google Docs vì bố cục của Sage notebook dựa trên bố cục của Google notebooks.
Các tác giả của Sage notebook xác nhận họ là người dùng thường xuyên của Mathematica notebook và Maple worksheet. Những động lực quan trọng khác khi phát triển Sage notebook gồm: thứ nhất, các nhà phát triển có liên hệ chặt chẽ với đội ngũ IPython, một phần vì phiên bản Sage chạy trên terminal dùng IPython. Thứ hai, có “một nỗ lực thất bại” của hai sinh viên nhằm cung cấp GUI cho IPython, và thứ ba, sự trỗi dậy của các ứng dụng web “AJAX” (viết tắt cho “Asynchronous JavaScript And XML”), vốn không yêu cầu người dùng tải lại toàn bộ trang mỗi lần thực hiện thao tác.
Ví dụ, khi bạn điền vào biểu mẫu trên trang web: không có AJAX, bạn sẽ được chuyển hướng sang trang mới với thông tin mới từ máy chủ khi nhấn nút gửi. Với AJAX, JavaScript sẽ gửi yêu cầu tới máy chủ, nhận kết quả và cập nhật màn hình. Bạn không cần tải lại trang, cũng không bị chuyển hướng.
Các ứng dụng AJAX khác mà bạn có thể biết: Gmail, Google Maps, Facebook, Twitter,… Như bạn thấy, gần như mọi thứ đều là AJAX.
IPython và Jupyter Notebook
Cuối năm 2001, khoảng hai mươi năm sau khi Guido van Rossum bắt đầu làm việc với Python tại Viện Nghiên cứu Quốc gia về Toán học và Khoa học Máy tính ở Hà Lan, Fernando Pérez bắt đầu phát triển IPython. Dự án chịu ảnh hưởng mạnh mẽ từ Mathematica notebook và Maple worksheet, giống như Sage notebook và nhiều dự án tiếp nối sau đó.
Năm 2005, có nỗ lực đầu tiên xây dựng hệ thống notebook bằng Wx, một bộ công cụ widget và thư viện để tạo GUI cho ứng dụng đa nền tảng. Hai sinh viên Google Summer of Code đã làm việc trên nguyên mẫu này dưới sự hướng dẫn của Robert Kern và Fernando Pérez. Sau đó, Robert tiếp tục đầu tư công sức vào vấn đề. Đây ít mang dáng dấp nguyên mẫu notebook hơn là một đợt dọn dẹp mã lõi IPython nhằm giúp việc viết một frontend wxPython cho shell IPython trở nên dễ dàng hơn. Chính những đợt dọn dẹp này đã giúp hình thành một hệ thống notebook sạch sẽ, và một phần trong số đó được hợp nhất dần vào IPython khi nỗ lực notebook cuối cùng cũng thành công.
Nguyên mẫu thứ hai cho IPython được xây dựng mùa hè 2006 bởi Min Ragan-Kelley dưới sự cố vấn của Brian Granger. Nó dựa trên web và có backend cơ sở dữ liệu SQL nhưng công việc bị dừng lại vì hiện thực hoá cuối cùng tỏ ra quá phức tạp với công nghệ web lúc bấy giờ.
Nguyên mẫu thứ ba của IPython notebook xuất hiện vào tháng 10/2010 và do bên thứ ba thực hiện trong vài ngày hack. Cuối cùng, vào mùa xuân–hè 2011, Brian Granger làm toàn thời gian trên nguyên mẫu notebook web, dựa trên công việc anh thực hiện năm 2010, nơi anh cùng Fernando Pérez tạo ra kiến trúc kernel và đặc tả thông điệp của IPython, và với Min Ragan Kelley tạo PyZMQ.
PyZMQ là thư viện cung cấp các ràng buộc Python cho ZeroMQ; Thư viện này cần thiết cho các tính năng tính toán song song của IPython, qt console và notebook.
PyZMQ và websockets là công nghệ chính giúp notebook khả thi. Vào mùa thu cùng năm, các cộng tác viên khác (như Matthias Bussonnier, Min và Fernando) cũng đóng góp. Đến ngày 21/12/2011, phiên bản đầu tiên của IPython Notebook (0.12) được phát hành.
Những năm sau đó, nhóm nhận được các giải thưởng như Advancement of Free Software dành cho Fernando Pérez vào ngày 23/03/2013 và Jolt Productivity Award, cùng nguồn tài trợ từ Alfred P. Sloan Foundation, v.v.
Cuối cùng, năm 2014, Dự án Jupyter bắt đầu như một dự án tách ra từ IPython.
Bản phát hành cuối của IPython trước khi tách bao gồm shell tương tác, notebook server, Qt console, v.v… trong một kho mã. Dự án đã lớn, với các thành phần ngày càng trở thành những dự án riêng biệt nhưng vẫn thuộc cùng một dự án.
Nhưng lưu ý rằng quy mô dự án không phải là lý do duy nhất để khởi động Dự án Jupyter: từ 2011 đến 2014, IPython notebook bắt đầu làm việc với các ngôn ngữ lập trình khác. Julia là ngôn ngữ đầu tiên, sau đó là R. Việc IPython notebook — ngụ ý notebook chỉ dựa trên Python — cũng hoạt động với kernel của các ngôn ngữ khác như Julia và R, đã gây bối rối cho mọi người.
Tại sao lại mang tên “IPython” nếu còn có các ngôn ngữ khác tham gia?
Tên “Jupyter” được gợi cảm hứng từ các ngôn ngữ mở hàng đầu cho khoa học (Julia, Python và R), và dù có vẻ như một từ viết tắt, nó không bao hàm rằng các ngôn ngữ khác không được chào đón. Hơn nữa, cái tên phản ánh tốt hơn dự án mà các nhà phát triển đã và đang xây dựng, đồng thời gợi nhắc nguồn gốc khoa học của dự án!
Sau khi Dự án Jupyter bắt đầu, các phần không phụ thuộc ngôn ngữ của IPython, như định dạng notebook, giao thức thông điệp, Qt console, ứng dụng web notebook, v.v. được chuyển sang dự án Jupyter. Bạn có thể tìm tổ chức Jupyter chính trên GitHub tại đây.
Trong cộng đồng Jupyter và IPython, điều này được gọi là “The Big Split”.
Hiện IPython chỉ còn hai vai trò: làm backend Python cho Jupyter Notebook, còn gọi là kernel, và một shell Python tương tác. Nhưng chưa hết: trong hệ sinh thái IPython, bạn cũng sẽ thấy khung tính toán song song. Bạn sẽ đọc thêm ở phần sau!
Và giống như IPython, Dự án Jupyter thực ra là tên gọi chung cho một loạt dự án: ba ứng dụng chính gồm Notebook, Console và Qt console, cùng các dự án con như JupyterHub để hỗ trợ triển khai notebook, nbgrader cho giáo dục, v.v. Bạn có thể xem tổng quan kiến trúc Jupyter tại đây.
Lưu ý rằng chính quá trình phát triển này giải thích sự nhầm lẫn mà nhiều Pythonista gặp phải khi nói về IPython và Jupyter: do cái này tách ra từ cái kia (khá gần đây), một số người vẫn khó dùng đúng tên cho các khái niệm. Còn một yếu tố gây rối hơn là tiến hóa của dự án: vì cái này sinh ra từ cái kia, có sự chồng lấn đáng kể giữa các tính năng của IPython và Jupyter Notebook mà đôi khi khó phân biệt! Cách phân biệt sẽ rõ hơn trong các phần tiếp theo. Nếu muốn biết thêm chi tiết về quá trình phát triển IPython, hãy xem ghi chép cá nhân của Fernando Pérez và William Stein về lịch sử notebook của họ.
R Notebooks
R Markdown và Jupyter Notebook đều cung cấp quy trình làm việc có thể tái lập, đan xen mã, đầu ra và văn bản trong một tài liệu duy nhất, hỗ trợ widget tương tác và xuất ra nhiều định dạng.
Tuy nhiên, hai công cụ cũng khác nhau: công cụ thứ nhất tập trung vào thực thi theo lô có thể tái lập, biểu diễn văn bản thuần, quản lý phiên bản, đầu ra sản xuất và cung cấp cùng trình soạn thảo, công cụ mà bạn dùng cho script R. Công cụ thứ hai tập trung vào việc hiển thị xen kẽ cùng mã, lưu đệm đầu ra qua các phiên, chia sẻ mã và đầu ra trong một tệp duy nhất. Notebook nhấn mạnh mô hình thực thi tương tác. Chúng không dùng biểu diễn văn bản thuần, mà dùng biểu diễn dữ liệu có cấu trúc như JSON.
Điều đó giải thích mục đích của ứng dụng notebook của RStudio: kết hợp mọi ưu điểm của R Markdown với những gì tốt đẹp mà notebook tính toán mang lại.
Để tìm hiểu cách làm việc với R notebook và những khác biệt chính xác giữa Jupyter và R Markdown notebook về chia sẻ notebook, quản lý dự án, kiểm soát phiên bản và hơn thế nữa, hãy xem bài Jupyter và R: Notebooks với R của DataCamp.
Các Data Science Notebook khác
Tất nhiên, còn nhiều notebook khác để bạn cân nhắc khi bước vào khoa học dữ liệu. Những năm gần đây, rất nhiều lựa chọn mới đã đến tay các nhà khoa học dữ liệu và người đam mê: không chỉ Beaker Notebook, Apache Zeppelin, Spark Notebook, DataBricks Cloud, v.v., mà còn các công cụ khác như Rodeo IDE hoặc nteract, cũng giúp phân tích dữ liệu của bạn mang tính tương tác và có thể tái lập. Một điểm đáng chú ý là nteract khác với các công cụ còn lại ở chỗ nó sử dụng kiến trúc Jupyter, như các giao thức và định dạng.
Tương lai của Notebook
Có vẻ như notebook sẽ còn ở lại lâu dài. Gần đây, thế hệ tiếp theo của Jupyter Notebook đã được giới thiệu với cộng đồng: JupyterLab. Ứng dụng Notebook không chỉ hỗ trợ Notebook mà còn có trình quản lý tệp, trình soạn thảo văn bản, trình giả lập terminal, bộ theo dõi các tiến trình Jupyter, trình quản lý cụm IPython và một “pager” để hiển thị trợ giúp.
Bạn có thể nghĩ rằng điều này không mới; Jupyter Notebook cũng có tất cả những thứ đó. Tuy nhiên, JupyterLab cho phép bạn sử dụng tất cả các khối xây dựng của tính toán tương tác theo những cách mới mẻ.
Đọc thêm tại đây.
Bộ công cụ phong phú của Jupyter Notebook phát triển một cách hữu cơ và được thúc đẩy bởi nhu cầu của người dùng và nhà phát triển. JupyterLab là kiến trúc thế hệ mới để hỗ trợ tất cả các công cụ này, với UI linh hoạt và phản hồi tốt, cung cấp bố cục do người dùng kiểm soát để kết nối các công cụ lại với nhau.
IPython hay Jupyter?
Quá trình phát triển và “Big Split” là nền tảng để hiểu sự khác biệt thực sự giữa hai công cụ. Nhưng do chúng gắn bó hữu cơ, đôi khi bạn sẽ băn khoăn đâu là phần của bên nào.
Phần sau sẽ điểm qua một số tính năng thuộc về hệ sinh thái IPython hoặc Dự án Jupyter.
Hãy tự bạn chọn đáp án đúng và khám phá thêm về từng tính năng!
Kernel?
Dù kernel giờ đây xuất hiện nổi bật trong Ứng dụng Jupyter Notebook, công cụ đầu tiên từng dùng một kernel hoàn chỉnh và giao thức là Qt console, phát triển trước Notebook. Hiện nay, cả về lịch sử lẫn kiến trúc, Notebook khai thác kernel một cách linh hoạt, và kernel là tính năng của Jupyter chứ không phải riêng Notebook. Điều này có nghĩa kernel còn hơn cả một tính năng: chúng là trừu tượng cốt lõi của kiến trúc Jupyter, và được dùng bởi các công cụ không phải notebook, như text console, Qt console, Thebe của O’Reilly, công cụ Kernel Gateway, trình soạn thảo hydrogen của nteract. Cuối cùng, trong JupyterLab, kernel cũng có thể kết nối với mọi thứ từ notebook đến web console hay thậm chí là tệp văn bản.
Kernel là chương trình chạy và nội chiếu mã của người dùng: nó cung cấp tính toán và giao tiếp với các giao diện frontend như notebook. Ứng dụng Jupyter Notebook có ba kernel chính: IPython, IRkernel và IJulia.
Vì tên “Jupyter” lấy cảm hứng từ các ngôn ngữ mở hàng đầu cho khoa học (Julia, Python và R), điều này cũng không mấy ngạc nhiên. Kernel IPython do đội ngũ Jupyter duy trì, như một kết quả của quá trình phát triển dự án.
Tuy vậy, bạn cũng có thể chạy nhiều ngôn ngữ khác như Scala, JavaScript, Haskell, Ruby, v.v. trong Ứng dụng Jupyter Notebook. Đó là các kernel do cộng đồng duy trì.
Triển khai Notebook?
Triển khai notebook là việc bạn thường thấy hoặc tìm hiểu khi làm việc với Jupyter notebook. Có khá nhiều gói giúp bạn triển khai notebook và thuộc hệ sinh thái Jupyter.
Dưới đây là một số:
docker-stackshữu ích khi bạn cần các stack ứng dụng Jupyter và kernel dưới dạng container Docker.ipywidgetscung cấp các widget HTML & JavaScript tương tác (như thanh trượt, hộp kiểm, ô nhập văn bản, biểu đồ, v.v.) cho kiến trúc Jupyter, kết hợp điều khiển frontend với kernel Jupyter.jupyter-drivecho phép IPython dùng Google Drive để quản lý tệp.jupyter-sphinx-themeđể thêm giao diện Jupyter Sphinx vào notebook của bạn. Nó giúp việc tạo tài liệu thông minh và đẹp mắt trở nên dễ dàng hơn.kernel_gatewaylà máy chủ web hỗ trợ nhiều cơ chế để khởi tạo và giao tiếp với kernel Jupyter. Xem tại đây để biết một số trường hợp sử dụng mà gói này phát huy tác dụng.nbviewerđể chia sẻ notebook của bạn. Xem thư viện tại đây.tmpnbđể tạo các máy chủ Jupyter Notebook tạm thời bằng container Docker. Tự trải nghiệm tại đây.traitletslà một framework cho phép lớp Python có thuộc tính với kiểm tra kiểu, giá trị mặc định được tính động và callback “on change”. Bạn cũng có thể dùng gói này để cấu hình, tải giá trị từ tệp hoặc tham số dòng lệnh. traitlets cung cấp sức mạnh cho hệ thống cấu hình của IPython và Jupyter và API khai báo của các widget tương tác IPython.
Sử dụng System Shell?
Có thể điều chỉnh IPython để dùng như system shell với “shell escape”: các dòng bắt đầu bằng ! sẽ được chuyển trực tiếp cho system shell. Ví dụ, !ls sẽ chạy ls trong thư mục hiện tại. Bạn có thể gán kết quả của lệnh hệ thống cho biến Python với cú pháp myfiles=!ls. Tuy nhiên, nếu bạn muốn in tường minh kết quả của lệnh ls dưới dạng danh sách chuỗi mà không gán cho biến, hãy dùng hai dấu chấm than (!!ls) hoặc magic %sx mà không gán.
# Assign the result to `ls`
ls = !ls
# Explicit `ls`
!!ls
# Or with magics
%sx
# Assign magics result
ls = %sx
Lưu ý các lệnh !! không thể gán vào biến, nhưng kết quả của một magic (miễn là nó trả về giá trị) có thể gán vào biến.
IPython cũng cho phép bạn mở rộng giá trị biến Python khi gọi lệnh hệ thống: chỉ cần đặt biến hoặc biểu thức trong ngoặc nhọn ({}). Ngoài ra, trong lệnh shell với ! hoặc !!, bất kỳ biến Python nào có tiền tố $ đều được mở rộng. Trong khối mã dưới đây, bạn sẽ thấy việc echo thuộc tính argv của biến sys. Lưu ý bạn cũng có thể dùng cú pháp $/$$ để truyền biến Python vào/ra từ đầu ra hệ thống, có thể dùng tiếp cho các kịch bản sau.
Để truyền một ký tự $ theo nghĩa đen vào shell, dùng cặp $$. Bạn sẽ cần dấu $ theo nghĩa đen này nếu muốn truy cập biến shell và biến môi trường như $PATH:
# Import and initialize
import math
x = 4
# System call with variable
!echo {math.factorial(x)}
# Expand a variable
!echo $sys.argv
# Use $$ for a literal $
!echo "A system variable: $$HOME"
Đọc thêm tại đây.
Lưu ý ngoài IPython, cũng có các kernel khác có cú pháp đặc biệt để đảm bảo các dòng được thực thi như lệnh shell! Chúng không thực sự là “magic” theo nghĩa hẹp vì có thể triển khai với bất kỳ tên nào và có thể hoàn toàn khác (và phong phú hơn hoặc kém hơn) so với magic của IPython.
Ngoài ra còn có các bí danh (alias) bạn có thể định nghĩa cho lệnh hệ thống. Các alias về cơ bản là lối tắt cho lệnh bash. Một alias là một bộ: (“showTheDirectory”, “ls”). Chạy %alias? để biết thêm thông tin!
Mẹo: dùng %rehashx để nạp toàn bộ $PATH của bạn thành alias trong IPython.
Magic?
Nếu bạn đã đọc Hướng dẫn Toàn diện về Jupyter Notebook của DataCamp hoặc đã làm việc với Jupyter, bạn có thể đã biết về các “magic command”. Magic thường gồm một phần tử cú pháp không hợp lệ trong ngôn ngữ nền tảng và một từ biểu thị lệnh. Bên dưới, hàm magic thực chất là các hàm Python.
Kernel IPython, như bạn đã biết, dùng phần tử cú pháp % vì nó không phải toán tử đơn ngôi hợp lệ trong Python. Tuy nhiên, các dòng bắt đầu bằng %% biểu thị “cell magic”: chúng nhận đối số không chỉ là phần còn lại của dòng hiện tại, mà cả tất cả các dòng phía dưới trong cùng khối thực thi. Cell magic thực tế có thể tuỳ ý sửa đổi đầu vào mà chúng nhận, thậm chí không cần là mã Python hợp lệ. Chúng nhận toàn bộ khối dưới dạng một chuỗi.
Magic là đặc thù và được cung cấp bởi kernel, được thiết kế để công việc và trải nghiệm của bạn trong Jupyter Notebook tương tác hơn nhiều. Việc magic command có khả dụng trong một kernel nhất định hay không phụ thuộc vào nhà phát triển kernel và khác nhau giữa các kernel. Bạn thấy đấy: magic là một tính năng của kernel.
Khi bạn dùng backend Python cho Jupyter Notebook là IPython, còn gọi là kernel, bạn có thể muốn dùng những mẹo sau để truy cập các chức năng giúp lập trình nhanh hơn, dễ hơn và tương tác hơn. Lưu ý danh sách sau không nhằm đầy đủ. Xem danh sách magic tích hợp sẵn để có cái nhìn toàn diện.
Vẽ biểu đồ
Một tính năng lớn của kernel IPython là khả năng hiển thị biểu đồ do các cell mã tạo ra. Kernel được thiết kế để hoạt động trơn tru với thư viện trực quan hóa dữ liệu matplotlib nhằm cung cấp chức năng này. Để sử dụng, hãy dùng magic %matplotlib.
Theo mặc định, biểu đồ sẽ hiển thị trong một cửa sổ riêng. Ngoài ra, bạn có thể chỉ định backend, như inline hoặc qt, để đầu ra của các lệnh vẽ hiển thị nội tuyến hoặc qua backend GUI khác. Bạn có thể đọc thêm tại đây.
Điều hướng hệ thống tệp
Các magic của kernel cũng cung cấp cách điều hướng qua hệ thống tệp. Magic %cd và %bookmark có thể dùng để đổi thư mục hoặc đánh dấu thư mục để truy cập nhanh các thư mục bạn thường dùng.
Truy cập Debugger
Tiếp theo, bạn có thể dùng magic để gọi trình gỡ lỗi Python %pdb mỗi khi có ngoại lệ không được bắt. Điều này sẽ dẫn bạn qua phần mã gây ra ngoại lệ, giúp nhanh chóng tìm nguồn gốc lỗi.
Bạn cũng có thể dùng magic %run với tùy chọn -d để chạy script dưới sự điều khiển của trình gỡ lỗi Python. Nó sẽ tự động thiết lập các breakpoint ban đầu cho bạn. Cuối cùng, bạn có thể dùng magic %debug để truy cập debugger còn dễ hơn.
Phần mở rộng IPython
Bạn có thể dùng magic %load_ext để nạp một phần mở rộng IPython theo tên module. Phần mở rộng IPython là các module Python sửa đổi hành vi của shell: chúng có thể đăng ký magic, định nghĩa biến và nói chung là chỉnh sửa không gian tên người dùng để cung cấp tính năng mới trong các cell mã. Ví dụ:
- Dùng
%load_ext oct2py.ipythonđể gọi liền mạch các tệp M và hàm Octave từ Python, - Dùng
%load_ext rpy2.ipythonđể dùng giao diện tới R chạy nhúng trong tiến trình Python, - Dùng
%load_ext Cythonđể sử dụng trình biên dịch từ Python sang C, - Dùng
sympy.init_printing()để tự động in đẹp các đối tượng Sympy Basic, và - Để dùng Fortran trong phiên tương tác, bạn có thể dùng
%load_ext fortranmagic.
… Còn nhiều nữa! Bạn có thể tạo và đăng ký phần mở rộng IPython của riêng mình và đăng ký chúng trên PyPi: điều này cũng có nghĩa là có rất nhiều phần mở rộng và magic do người dùng tạo ra ngoài kia! Một ví dụ là ipython_unittest, và hãy xem cả Extensions Index.
Một trong những phần mở rộng khác đáng để ý là sparkmagic, bộ công cụ làm việc tương tác với các cụm Spark từ xa thông qua Livy, một máy chủ REST của Spark, trong Jupyter notebook. Thư viện sparkmagic cung cấp magic %%spark để bạn dễ dàng chạy mã lên cụm Spark từ xa từ một notebook IPython thông thường.
# Load in sparkmagic
%load_ext sparkmagic.magics
# Set the endpoint
%manage_spark
# Ask for help
%spark?
Truy cập tại đây để xem thêm ví dụ về cách dùng các magic này để làm việc tương tác với cụm Spark.
Lưu ý IPython có hai magic khác ngoài %load_ext để cho phép bạn quản lý phần mở rộng ngay trong Jupyter Notebook: %reload_ext và %unload_ext để lần lượt dỡ, nhập lại và nạp phần mở rộng, và để dỡ phần mở rộng.
Kernel khác, Magic khác
Tuy nhiên, trong các ngôn ngữ khác, phần tử cú pháp trong magic command có thể mang ý nghĩa riêng. Kernel R, IRKernel, không có hệ thống magic. Để thực thi lệnh bash, chẳng hạn, bạn sẽ dùng các hàm R như system() để gọi lệnh hệ điều hành. Ví dụ là system("head -5 *.csv", intern=TRUE). Lưu ý khi thêm đối số intern, bạn chỉ rõ rằng muốn lấy đầu ra của lệnh thành một vector ký tự trong R. Để hiển thị đầu vào markdown, bạn dùng display_markdown(), truyền mã Markdown dưới dạng vector ký tự. Tương tự, Kernel Julia là IJulia cũng không dùng “magic”. Thay vào đó, các cú pháp khác để đạt cùng mục tiêu lại tự nhiên hơn trong Julia, hoạt động ngoài các ô mã IJulia và thường mạnh mẽ hơn. Tuy nhiên, các nhà phát triển kernel IJulia đã đảm bảo rằng bất cứ khi nào bạn nhập một magic của IPython trong ô mã IJulia, bạn sẽ thấy thông báo trợ giúp giải thích cách đạt hiệu ứng tương tự trong Julia nếu có thể.
Ví dụ, tương đương với %load của IPython trong IJulia là IJulia.load().
Mặt khác, có các kernel như kernel Scala IScala hỗ trợ magic tương tự IPython. Tuy nhiên, tập magic khác nhau vì phải phù hợp với đặc thù của Scala và JVM. Magic gồm dấu phần trăm % theo sau là một định danh và đầu vào tùy chọn. Một số magic đáng chú ý:
# Type Information
%type 1
# Library Management
%libraryDependencies
%update
Như bạn đã đọc ở trên, thư viện sparkmagic cũng cung cấp một tập kernel Scala và Python cho phép bạn tự động kết nối đến cụm Spark từ xa, chạy mã và truy vấn SQL, quản lý máy chủ Livy và cấu hình job Spark, và tạo trực quan hóa tự động. Tất cả mà không cần viết thêm mã!
Ví dụ, bạn có thể dễ dàng thực thi truy vấn SparkSQL với %%sql hoặc truy cập thông tin ứng dụng và log Spark qua magic %%info.
Nếu bạn đang làm việc với một kernel khác và muốn biết có thể dùng magic hay không, sẽ hữu ích khi biết rằng có một số kernel xây dựng dựa trên dự án metakernel và trong đa số trường hợp sẽ dùng cùng các magic mà bạn cũng thấy trong kernel IPython. Bạn có thể tìm danh sách magic của metakernel tại đây. Metakernel là một mẫu kernel Jupyter/IPython bao gồm các hàm magic cốt lõi.
Một vài ví dụ:
- Kernel MATLAB
matlab_kernel, - Kernel Octave
octave_kernel, - Kernel Java9
java9_kernel, - Kernel Wolfram
wolfram_kernel, - Kernel SAS. … Và còn nhiều nữa!
Điều này có nghĩa là, ví dụ khi bạn dùng kernel MATLAB, bạn sẽ có các magic sau khả dụng:
Available line magics:
%cd %connect_info %download %edit %get %help %html %install %install_magic %javascript %kernel %kx %latex %load %ls %lsmagic %magic %parallel %plot %pmap %px %python %reload_magics %restart %run %set %shell %spell
Available cell magics:
%%debug %%file %%help %%html %%javascript %%kx %%latex %%processing %%px %%python %%shell %%show %%spell
Nếu bạn nhìn vào khối được in ở trên, bạn sẽ thấy một số magic trông rất quen thuộc. Với những ai chưa rành về magic, hãy so sánh khối trên với các magic có sẵn theo mặc định trong kernel IPython và bạn sẽ thấy có một số magic trùng nhau:
Available line magics:
%alias %alias_magic %autocall %automagic %autosave %bookmark %cat %cd %clear %colors %config %connect_info %cp %debug %dhist %dirs %doctest_mode %ed %edit %env %gui %hist %history %killbgscripts %ldir %less %lf %lk %ll %load %load_ext %loadpy %logoff %logon %logstart %logstate %logstop %ls %lsmagic %lx %macro %magic %man %matplotlib %mkdir %more %mv %notebook %page %pastebin %pdb %pdef %pdoc %pfile %pinfo %pinfo2 %popd %pprint %precision %profile %prun %psearch %psource %pushd %pwd %pycat %pylab %qtconsole %quickref %recall %rehashx %reload_ext %rep %rerun %reset %reset_selective %rm %rmdir %run %save %sc %set_env %store %sx %system %tb %time %timeit %unalias %unload_ext %who %who_ls %whos %xdel %xmode
Available cell magics:
%%! %%HTML %%SVG %%bash %%capture %%debug %%file %%html %%javascript %%js %%latex %%perl %%prun %%pypy %%python %%python2 %%python3 %%ruby %%script %%sh %%svg %%sx %%system %%time %%timeit %%writefile
Tựu trung, bạn có thể dùng một câu hỏi để phân biệt magic nào đặc thù IPython và magic nào có thể dùng ở kernel khác: chức năng này có đặc thù Python hay là thứ chung chung cũng dùng được trong ngôn ngữ bạn đang làm việc?
Ví dụ, %pdb hay Python Debugger hoặc %matplotlib là thứ đặc thù Python và sẽ không hợp lý khi bạn dùng kernel JavaScript. Tuy nhiên, đổi thư mục với %cd là việc rất chung và nên hoạt động ở bất kỳ ngôn ngữ nào, vì nó là một lệnh “chung”. Vì vậy, khả năng cao đây là magic có thể dùng ở kernel khác. Tất nhiên, bạn vẫn cần biết kernel của mình có dùng magic hay không.
Chuyển đổi và định dạng Notebook?
Chuyển đổi và định dạng notebook là những tính năng bạn sẽ thấy trong hệ sinh thái Jupyter. Hai công cụ bạn thường gặp cho các tác vụ này là nbconvert và nbformat.
Bạn có thể dùng công cụ thứ nhất để chuyển notebook sang nhiều định dạng khác nhằm trình bày thông tin ở định dạng quen thuộc, xuất bản nghiên cứu và nhúng notebook vào bài báo, cộng tác với người khác và chia sẻ nội dung tới khán giả rộng hơn.
Công cụ thứ hai về cơ bản chứa định dạng Jupyter Notebook và là chìa khóa để hiểu rằng tệp notebook là các tài liệu JSON đơn giản chứa: metadata (như kernel hoặc thông tin ngôn ngữ), phiên bản định dạng notebook (chính và phụ), và các cell nơi toàn bộ văn bản, mã, v.v. được lưu trữ.
Lưu và tải Notebook?
Lưu và tải notebook là tính năng của Ứng dụng Jupyter Notebook. Bạn có thể tải notebook, được lưu với phần mở rộng .ipynb mà người khác tạo, bằng cách tải xuống và mở tệp trong ứng dụng Jupyter. Cụ thể, bạn có thể tạo một notebook mới rồi chọn mở tệp bằng cách nhấp thẻ “File”, chọn “Open” và chọn notebook đã tải về.
Ngược lại, bạn cũng có thể lưu notebook của mình bằng cách nhấp vào cùng thẻ “File” và chọn “Download as” để lấy tệp notebook của bạn, hoặc chọn lưu tệp và tạo một checkpoint. Điều này rất hữu ích khi bạn muốn kiểm soát phiên bản ở mức cơ bản và có thể quay lại phiên bản trước đó của notebook. Dĩ nhiên, các thay đổi của bạn cũng được tự động lưu vài phút một lần, nên không phải lúc nào cũng cần thực hiện thao tác này một cách tường minh.
Lưu ý bạn cũng có thể chọn không lưu bất kỳ thay đổi nào vào notebook gốc bằng cách tạo một bản sao và lưu mọi thay đổi vào bản sao đó!
Phím tắt & Hỗ trợ đa con trỏ?
Chọn nhiều cell, bật/tắt đầu ra của cell, chèn cell mới, v.v. Với tất cả thao tác này, bạn có các phím tắt là một phần của Jupyter Notebook. Bạn có thể tìm danh sách phím tắt trong menu trên cùng: vào thẻ “Help” và chọn “Keyboard Shortcuts”.
Ngoài ra, hỗ trợ đa con trỏ cũng là một tính năng bạn sẽ thấy trong Jupyter Notebook!
Mạng tính toán song song?
Mạng tính toán song song từng là một phần của dự án IPython, nhưng từ phiên bản 4.0, nó là gói độc lập gọi là ipyparallel. Gói này cơ bản là tập hợp các script CLI để điều khiển các cụm cho Jupyter.
Dù tách riêng, đây vẫn là thành phần mạnh mẽ của hệ sinh thái IPython nhưng thường bị bỏ qua; Nó mạnh vì thay vì chạy một kernel Python đơn lẻ, nó cho phép bạn khởi động nhiều kernel phân tán trên nhiều máy.
Các trường hợp sử dụng điển hình của ipyparallel là khi bạn cần chạy mô hình nhiều lần để ước lượng phân phối của đầu ra hoặc cách chúng thay đổi theo tham số đầu vào. Khi các lượt chạy mô hình độc lập, bạn có thể tăng tốc bằng cách chạy song song trên nhiều máy tính trong cụm. Hãy nghĩ đến huấn luyện mô hình phân tán hoặc mô phỏng.
Terminal?
Tính năng này là một phần của hệ sinh thái Jupyter: bạn có Jupyter Console và một ứng dụng terminal của Jupyter. Tuy nhiên, ngay từ đầu, IPython được dùng để chỉ terminal dòng lệnh tương tác gốc cho Python. Nó cung cấp môi trường REPL (read-eval-print loop) nâng cao, đặc biệt phù hợp với tính toán khoa học. Đây là tiêu chuẩn trước năm 2011, khi công cụ Notebook được giới thiệu và bắt đầu cung cấp giao diện web hiện đại, mạnh mẽ cho Python.
Tiếp theo, bạn cũng có IPython console, vốn khởi chạy hai tiến trình: shell terminal IPython gốc và profile hay kernel mặc định được khởi động nếu không chỉ định khác. Mặc định là Python. IPython console giờ đã bị loại bỏ và nếu bạn muốn khởi chạy, bạn sẽ cần dùng Jupyter Console, là frontend console dựa trên terminal cho các kernel Jupyter. Mã này dựa trên IPython terminal đơn tiến trình. Jupyter Console cung cấp trải nghiệm phía client tương tác của IPython tại terminal, nhưng có khả năng kết nối đến bất kỳ kernel Jupyter nào thay vì chỉ IPython. Điều này cho phép bạn thử bất kỳ kernel Jupyter nào đã cài đặt ngay tại terminal, mà không cần khởi động Notebook đầy đủ. Console cho phép tương tác dựa trên terminal với các kernel Jupyter khác như IJulia, IRKernel.
Cuối cùng, Ứng dụng Jupyter Notebook cũng có Ứng dụng Terminal: một terminal bash đơn giản chạy trong trình duyệt. Bạn có thể dễ dàng tìm thấy khi khởi động ứng dụng và chọn terminal mới từ menu thả xuống.
Qt Console?
Qt console từng là một phần của dự án IPython, nhưng giờ đã chuyển sang dự án Jupyter. Đây là một ứng dụng gọn nhẹ, cảm giác giống terminal nhưng cung cấp nhiều cải tiến chỉ có thể có trong GUI, như hình ảnh nội tuyến, chỉnh sửa đa dòng chuẩn với tô sáng cú pháp, gợi ý lời gọi hàm dạng đồ họa và nhiều hơn nữa. Qt console có thể dùng bất kỳ kernel Jupyter nào.
Kết luận
Bài đăng hôm nay là phần bổ sung cho Hướng dẫn Toàn diện của DataCamp và đã trình bày chi tiết hơn về lịch sử các notebook tính toán, cùng một số tính năng chính của cả dự án IPython và Jupyter để bạn hiểu rõ hơn quá trình phát triển và sự khác biệt giữa hai công cụ. Mục tiêu là cho thấy việc phân biệt đôi khi khó khăn nếu bạn không xét đến bối cảnh lịch sử của hai dự án. Trong một số trường hợp, có một vùng xám, khoảng “ở giữa”, khó mà phân loại rõ ràng.