Médéric Hurier (Fmind) commited on
Commit
13a7d69
·
1 Parent(s): 5b41ebf

refactoring

Browse files
.env.sample ADDED
@@ -0,0 +1 @@
 
 
1
+ OPENAI_API_KEY=TODO
.gitignore CHANGED
@@ -1,14 +1,5 @@
1
- # https://git-scm.com/docs/gitignore
2
-
3
- # gradio
4
- flagged/
5
- gradio_cached_examples/
6
-
7
- # mypy
8
  .mypy_cache/
9
-
10
- # python
11
  __pycache__/
12
-
13
- # venv
14
- .venv/
 
1
+ .env
2
+ .venv/
 
 
 
 
 
3
  .mypy_cache/
4
+ .ruff_cache/
 
5
  __pycache__/
 
 
 
.python-version CHANGED
@@ -1 +1 @@
1
- 3.11
 
1
+ 3.12
README.md CHANGED
@@ -1,15 +1,14 @@
1
  ---
2
  title: Resume
3
  emoji: 🧑🏻‍💻
4
- colorFrom: blue
5
- colorTo: gray
 
6
  sdk: gradio
7
- python_version: 3.11
8
- sdk_version: 3.46.0
9
  app_file: app.py
10
  fullWidth: false
11
- pinned: false
12
  license: mit
13
  ---
14
-
15
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
1
  ---
2
  title: Resume
3
  emoji: 🧑🏻‍💻
4
+ short_description: AI Assistant for Fmind's Resume.
5
+ colorFrom: indigo
6
+ colorTo: blue
7
  sdk: gradio
8
+ python_version: 3.12
9
+ sdk_version: 4.29.0
10
  app_file: app.py
11
  fullWidth: false
12
+ pinned: true
13
  license: mit
14
  ---
 
 
database.py DELETED
@@ -1,107 +0,0 @@
1
- #!/usr/bin/env python3
2
- """Manage the project database."""
3
-
4
- # %% IMPORTS
5
-
6
- import argparse
7
- import logging
8
- import re
9
- import sys
10
- import typing as T
11
-
12
- import lib
13
-
14
- # %% LOGGING
15
-
16
- logging.basicConfig(
17
- level=logging.DEBUG,
18
- format="[%(asctime)s][%(levelname)s] %(message)s",
19
- )
20
-
21
- # %% PARSING
22
-
23
- PARSER = argparse.ArgumentParser(description=__doc__)
24
- PARSER.add_argument("files", type=argparse.FileType("r"), nargs="+")
25
- PARSER.add_argument("--database", type=str, default=lib.DATABASE_PATH)
26
- PARSER.add_argument("--collection", type=str, default=lib.DATABASE_COLLECTION)
27
-
28
- # %% FUNCTIONS
29
-
30
-
31
- def segment_text(text: str, pattern: str) -> T.Iterator[tuple[str, str]]:
32
- """Segment the text in title and content pair by pattern."""
33
- splits = re.split(pattern, text, flags=re.MULTILINE)
34
- pairs = zip(splits[1::2], splits[2::2])
35
- return pairs
36
-
37
-
38
- def import_file(
39
- file: T.TextIO,
40
- collection: lib.Collection,
41
- encoding_function: T.Callable,
42
- max_output_tokens: int = lib.ENCODING_OUTPUT_LIMIT,
43
- ) -> tuple[int, int]:
44
- """Import a markdown file to a database collection."""
45
- n_chars = 0
46
- n_tokens = 0
47
- text = file.read()
48
- filename = file.name
49
- segments_h1 = segment_text(text=text, pattern=r"^# (.+)")
50
- for h1, h1_text in segments_h1:
51
- logging.debug('\t- H1: "%s" (%d)', h1, len(h1_text))
52
- segments_h2 = segment_text(text=h1_text, pattern=r"^## (.+)")
53
- for h2, content in segments_h2:
54
- content_chars = len(content)
55
- content_tokens = len(encoding_function(content))
56
- logging.debug('\t\t- H2: "%s" (%d)', h2, content_chars)
57
- id_ = f"{filename} # {h1} ## {h2}" # unique doc id
58
- document = f"# {h1}\n\n## {h2}\n\n{content.strip()}"
59
- metadata = {"filename": filename, "h1": h1, "h2": h2}
60
- assert (
61
- content_tokens < max_output_tokens
62
- ), f"Content is too long ({content_tokens}): #{h1} ##{h2}"
63
- collection.add(ids=id_, documents=document, metadatas=metadata)
64
- n_tokens += content_tokens
65
- n_chars += content_chars
66
- return n_chars, n_tokens
67
-
68
-
69
- def main(args: list[str] | None = None) -> int:
70
- """Main function of the script."""
71
- # parsing
72
- opts = PARSER.parse_args(args)
73
- # database
74
- database_path = opts.database
75
- logging.info("Database path: %s", database_path)
76
- client = lib.get_database_client(path=database_path)
77
- logging.info("- Reseting database client: %s", client.reset())
78
- # encoding
79
- encoding_function = lib.get_encoding_function()
80
- logging.info("Encoding function: %s", encoding_function)
81
- # embedding
82
- embedding_function = lib.get_embedding_function()
83
- logging.info("Embedding function: %s", embedding_function)
84
- # collection
85
- database_collection = opts.collection
86
- logging.info("Database collection: %s", database_collection)
87
- collection = client.create_collection(
88
- name=database_collection, embedding_function=embedding_function
89
- )
90
- # files
91
- for i, file in enumerate(opts.files):
92
- logging.info("Importing file %d: %s", i, file.name)
93
- n_chars, n_tokens = import_file(
94
- file=file, collection=collection, encoding_function=encoding_function
95
- )
96
- logging.info(
97
- "- Docs imported from file %s: %d chars | %d tokens", i, n_chars, n_tokens
98
- )
99
- # return
100
- return 0
101
-
102
-
103
- # %% ENTRYPOINTS
104
-
105
-
106
- if __name__ == "__main__":
107
- sys.exit(main())
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
database/554fcd7c-6a4f-4732-bde1-c069ca314316/data_level0.bin DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:f18abd8c514282db82706e52b0a33ed659cd534e925a6f149deb7af9ce34bd8e
3
- size 6284000
 
 
 
 
database/554fcd7c-6a4f-4732-bde1-c069ca314316/header.bin DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:effaa959ce2b30070fdafc2fe82096fc46e4ee7561b75920dd3ce43d09679b21
3
- size 100
 
 
 
 
database/554fcd7c-6a4f-4732-bde1-c069ca314316/length.bin DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:fc19b1997119425765295aeab72d76faa6927d4f83985d328c26f20468d6cc76
3
- size 4000
 
 
 
 
database/554fcd7c-6a4f-4732-bde1-c069ca314316/link_lists.bin DELETED
File without changes
database/chroma.sqlite3 DELETED
@@ -1,3 +0,0 @@
1
- version https://git-lfs.github.com/spec/v1
2
- oid sha256:3b9f1ba4fe737d92cd7ad2230f67c0a9dd793ad0185a1a38d9ef5e9618e6923b
3
- size 1671168
 
 
 
 
files/linkedin.html DELETED
The diff for this file is too large to render. See raw diff
 
files/linkedin.md CHANGED
@@ -5,86 +5,80 @@
5
  - First name: Médéric
6
  - Last name: HURIER
7
  - Pseudo: Fmind
8
- - Followers: 4K
9
- - Location: Luxembourg, Luxembourg
10
- - Education: University of Luxembourg
11
- - Current position: Decathlon Technology
12
- - Public URL: www.linkedin.com/in/fmind-dev
13
  - Industry: Technology, Information and Internet
14
- - Address: 28 Avenue François Clément, 5612 Mondorf-les-Bains, Luxembourg
15
- - Headline: Freelancer | AI/ML/MLOps Engineer | Data Scientist | MLOps Community Organizer | OpenClassrooms Mentor | Hacker | PhD
 
 
16
 
17
  ## Websites
18
 
19
- - Company website: https://www.fmind.dev
 
 
20
  - Twitter: https://twitter.com/fmind_dev
21
- - Portfolio: https://github.com/fmind/
22
- - Blog: https://fmind.medium.com/
23
 
24
  ## About
25
 
26
- Note: I'm not available to work on new missions until the 1st of
27
- September 2024. Thank you for your understanding.
28
 
29
- When I worked as a teacher, I told my students that Artificial
30
- Intelligence and Machine Learning are the most effective levers to make
31
- a difference. Every day, new AI and ML solutions are released to empower
32
- companies and individuals alike. The question is: Is your business ready
33
- to provide the best AI/ML products for your customers?
34
 
35
- I'm a professional Machine Learning Engineer, Data Scientist, and MLOps
36
- ready to assist you in this quest. I've completed a Ph.D. in Machine
37
- Learning and several high-end AI/ML certifications to help you build
38
- leading data-driven services. My past experiences include working with
39
- companies like Google, BNP Paribas, ArcelorMittal, the European
40
- Commission, and Decathlon to frame their needs, create state-of-the-art
41
- models and deliver AI/ML artifacts at scale.
42
-
43
- I now work as a freelancer in Luxembourg, and I can carry out missions
44
- remotely in other European countries. You can get in touch with me on
45
- LinkedIn or at contact@fmind.dev. I'll be happy to collaborate with you
46
- or discuss your favored AI/ML topics in the MLOps Community.
47
 
48
  # Experience
49
 
50
- ## Lead MLOps Engineer
51
 
 
52
  - Company: Decathlon Technology
53
- - Period: Sep 2022 - Present
54
  - Location: Luxembourg (Hybrid)
55
- - Mission: Continue the design and implementation of Decathlon's MLOps platform with Databricks and AWS.
56
- - Skills: Artificial Intelligence (AI) · Machine Learning · MLOps · Python · ChatGPT · Agile Methodology · MLflow · Docker · Jira · Git · DataBricks · Apache Airflow · AWS SageMaker · Terraform · Apache Spark · Kubernetes
57
-
58
- ## Mentor for aspiring Data Scientist and AI/ML Engineer
59
-
60
- - Company: OpenClassrooms
61
- - Period: Mar 2023 - Present
 
 
 
 
 
 
62
  - Location: France (Remote)
63
  - Mission: Tutoring adult students to become data scientists specializing in machine learning.
64
- - Courses:
65
- - https://openclassrooms.com/fr/paths/793-data-scientist
66
- - https://openclassrooms.com/fr/paths/794-machine-learning-engineer
67
- - https://openclassrooms.com/fr/paths/795-ai-engineer
68
  - Skills: Artificial Intelligence (AI) · Machine Learning · Python · Deep Learning · Data Science · Statistics · ChatGPT · Big Data · Jupyter · Pandas · Git · Natural Language Processing (NLP) · Scikit-Learn
69
 
70
- ## Senior Data Scientist & Project Manager
71
 
 
72
  - Company: Cronos Europa
73
  - Customer: European Commission
74
- - Period: Dec 2021 - Sep 2022
75
  - Location: Luxembourg (Hybrid)
76
  - Mission: Enhance the ARACHNE risk scoring tool (fraud detection).
77
  - Main tasks and responsibilities:
78
  - Develop a new version of Arachne using data mining techniques
79
  - Manage the development of the Arachne PoC/Project (SCRUM)
80
- - Assist data scientists in their projects (Virtual Assistant, NLP,
81
- …)
82
  - Skills: Artificial Intelligence (AI) · Machine Learning · MLOps · Python · Deep Learning · Data Science · Big Data · Agile Methodology · Project Management · Functional Programming · Jupyter · Pandas · Docker · Jira · Git · PostgreSQL · AWS SageMaker · Flask · UML · API REST · Terraform · Transformers · Natural Language Processing (NLP) · Data Engineering · Microsoft Azure Machine Learning · Neo4j
83
 
84
- ## Project Manager & Machine Learning Engineer
85
 
 
86
  - Company: SFEIR Luxembourg
87
- - Period: Dec 2020 - Dec 2021
 
88
  - Location: Luxembourg (Remote)
89
  - Mission: Design and implement the next ML/MLOps platform on AWS and GCP.
90
  - Main tasks and responsibilities:
@@ -99,10 +93,11 @@ or discuss your favored AI/ML topics in the MLOps Community.
99
  - Environments: AWS (SageMaker), GCP (Vertex AI), DataBricks
100
  - Skills: Artificial Intelligence (AI) · Machine Learning · MLOps · Python · Deep Learning · Data Science · Big Data · Agile Methodology · Project Management · Functional Programming · Google Cloud Platform (GCP) · Tensorflow · MLflow · Jupyter · Pandas · Docker · Keras · Jira · Git · DataBricks · Apache Airflow · AWS SageMaker · Flask · UML · Terraform · Data Engineering · Vertex AI (GCP) · Apache Spark · Scikit-Learn · Kubernetes
101
 
102
- ## Data Scientist
103
 
104
- - Company: SFEIR
105
- - Period: Oct 2020 - Nov 2020
 
106
  - Location: Luxembourg (Remote)
107
  - Mission: Improve the visibility and assets of SFEIR's Data Team.
108
  - Main tasks and responsibilities:
@@ -113,11 +108,12 @@ or discuss your favored AI/ML topics in the MLOps Community.
113
  - Create a group to write tutorials and kata on AI/ML for SFEIR developers.
114
  - Skills: Artificial Intelligence (AI) · Machine Learning · MLOps · Python · Deep Learning · Data Science · Agile Methodology · Functional Programming · Google Cloud Platform (GCP) · Tensorflow · Jupyter · Pandas · Keras · Git · MongoDB · Vertex AI (GCP) · Apache Spark · Scikit-Learn
115
 
116
- ## Data Scientist
117
 
118
- - Company: SFEIR
 
119
  - Customer: ArcelorMittal
120
- - Period: Jan 2020 - Sep 2020
121
  - Location: Luxembourg (Remote)
122
  - Mission: Train and optimize machine learning models to recommend steel prices.
123
  - Main tasks and responsibilities:
@@ -130,18 +126,20 @@ or discuss your favored AI/ML topics in the MLOps Community.
130
  - Environment: MS-SQL, Azure Cloud, Jira, Papermill
131
  - Skills: Artificial Intelligence (AI) · Machine Learning · MLOps · Python · Data Science · Agile Methodology · Functional Programming · Jupyter · Pandas · Jira · Git · Natural Language Processing (NLP) · Scikit-Learn
132
 
133
- ## Research And Development Specialist
134
 
 
135
  - Company: University of Luxembourg
136
- - Period: Sep 2019 - Jan 2020
137
  - Location: Luxembourg
138
  - Mission: Management and development of Natural Language Understanding (NLU) projects for BGL BNP Paribas.
139
  - Skills: Artificial Intelligence (AI) · Machine Learning · Python · Data Science · Big Data · Functional Programming · Tensorflow · Jupyter · Pandas · Docker · Git · PostgreSQL · Ansible · Flask · UML · JSON · API REST · Transformers · Natural Language Processing (NLP) · Apache Spark · Scikit-Learn
140
 
141
- ## Doctoral researcher
142
 
 
143
  - Company: University of Luxembourg
144
- - Period: Sep 2015 - Jan 2020
145
  - Location: Luxembourg
146
  - Missions:
147
  - Research activities focused on Android security and artificial intelligence.
@@ -149,58 +147,65 @@ or discuss your favored AI/ML topics in the MLOps Community.
149
  - Collaboration with Google, San Francisco on finding malicious Android artifacts.
150
  - Skills: Artificial Intelligence (AI) · Machine Learning · Python · Deep Learning · Data Science · Statistics · Big Data · Cybersecurity · Functional Programming · Jupyter · Pandas · Docker · Git · NoSQL · MongoDB · PostgreSQL · ElasticSearch · Ansible · Flask · JSON · Android · API REST · Natural Language Processing (NLP) · Data Engineering · Apache Spark · Scikit-Learn
151
 
152
- ## Mentor for aspiring Data Scientist
153
 
154
- - Company: OpenClassrooms
155
- - Period: Aug 2018 - Dec 2019
 
156
  - Location: France
157
  - Mission: Tutoring adult students to become data scientists specializing in machine learning.
158
  - Skills: Artificial Intelligence (AI) · Machine Learning · Python · Data Science · Jupyter · Pandas · Git · Flask · JSON · API REST · Scikit-Learn
159
 
160
- ## Security engineer specialized in log management and analysis
161
 
 
162
  - Company: Clearstream
163
- - Period: Apr 2014 - Aug 2015
164
  - Location: Luxembourg
165
  - Mission: Selection and deployment of a SIEM solution, participating in security incident response.
166
  - Skills: Python · Big Data · ISO 27001 · Cybersecurity · Jupyter · Pandas · Git · ElasticSearch · Data Engineering
167
 
168
  ## Web developer and administrator
169
 
 
170
  - Company: Freaxmind
171
- - Period: Aug 2011 - Aug 2013
172
  - Location: France
173
  - Mission: Various contracts ranging from web development to software maintenance and debugging.
174
  - Skills: Python · Object Oriented Programming (POO) · Git · Ansible · Flask
175
 
176
- ## Web Developer
177
 
 
178
  - Company: Toul'embal
179
- - Period: Jun 2012 - Aug 2012
180
  - Location: Toul, France
181
  - Mission: Extension of a Prestashop e-commerce website and creation a portfolio website with WordPress.
182
  - Skills: Object Oriented Programming (POO)
183
 
184
- ## Web Programmer
185
 
 
186
  - Company: Empreinte Studio
187
- - Period: Oct 2010 - Aug 2011
188
  - Location: Épernay, France
189
  - Mission: Creation of modern website in PHP and MySQL with professional writers and graphic designers.
190
  - Skills: Object Oriented Programming (POO) · Git
191
 
192
- ## Software Developer
193
 
 
194
  - Company: GEOVARIANCES
195
- - Period: Sep 2009 - Sep 2010
196
  - Location: Avon, France
197
  - Mission: Development of a geostatistic application in C++ and Qt with experienced software engineers.
198
  - Skills: Object Oriented Programming (POO) · Git · UML
199
 
200
- ## Web Developer
201
 
 
202
  - Company: CV Champagne Nicolas Feuillatte
203
- - Period: Apr 2009 - Aug 2009
204
  - Location: Épernay, France
205
  - Mission: Integration of customer and share management modules to J.D. Edwards with PHP and Oracle.
206
  - Skills: Object Oriented Programming (POO)
@@ -252,19 +257,30 @@ or discuss your favored AI/ML topics in the MLOps Community.
252
  - Location: Reims (France)
253
  - Period: 2003 - 2006
254
 
255
- # Volunteer Experiences
256
 
257
  ## MLOps Community Organizer (Luxembourg)
258
 
259
  - Community: MLOps Community
260
  - Role: Organizer
261
  - Location: Luxembourg
262
- - Period: Nov 2022 - present
263
  - Field: Science and Technology
264
- - Mission: Organize regular meetups and events for the MLOps Community.
265
- - Partners: AWS and the University of Luxembourg.
 
 
266
  - Link: https://www.meetup.com/luxembourg-mlops-community/
267
 
 
 
 
 
 
 
 
 
 
268
  # Licenses & Certifications
269
 
270
  ## Machine Learning Associate
@@ -720,27 +736,51 @@ or discuss your favored AI/ML topics in the MLOps Community.
720
 
721
  # Publications
722
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
723
  ## Is AI/ML Monitoring just Data Engineering? 🤔
724
 
725
  - Publisher: MLOps Community
726
  - Publication date: July 24, 2023
727
  - Link: https://mlops.community/is-ai-ml-monitoring-just-data-engineering-%f0%9f%a4%94/
728
 
729
- While the future of machine learning and MLOps is being debated,
730
- practitioners still need to attend to their machine learning models
731
- in production. This is no easy task, as ML engineers must constantly
732
- assess the quality of the data that enters and exits their
733
- pipelines, and ensure that their models generate the correct
734
- predictions. To assist ML engineers with this challenge, several
735
- AI/ML monitoring solutions have been developed.
736
- In this article, I will discuss the nature of AI/ML monitoring and
737
- how it relates to data engineering. First, I will present the
738
- similarities between AI/ML monitoring and data engineering. Second,
739
- I will enumerate additional features that AI/ML monitoring solutions
740
- can provide. Third, I will briefly touch on the topic of AI/ML
741
- observability and its relation to AI/ML monitoring. Finally, I will
742
- provide my conclusion about the field of AI/ML monitoring and how it
743
- should be considered to ensure the success of your AI/ML project.
744
 
745
  ## A great MLOps project should start with a good Python Package 🐍
746
 
@@ -748,14 +788,7 @@ should be considered to ensure the success of your AI/ML project.
748
  - Publication date: June 28, 2023
749
  - Link: https://mlops.community/a-great-mlops-project-should-start-with-a-good-python-package-%f0%9f%90%8d/
750
 
751
- In this article, I present the implementation of a Python package on
752
- GitHub designed to support MLOps initiatives. The goal of this
753
- package is to make the coding workflow of data scientists and ML
754
- engineers as flexible, robust, and productive as possible. First, I
755
- start by motivating the use of Python packages. Then, I provide some
756
- tools and tips you can include in your MLOps project. Finally, I
757
- explain the follow-up steps required to take this package to the
758
- next level and make it work in your environment.
759
 
760
  ## Fixing the MLOps Survey on LLMs with ChatGPT API: Lessons Learned
761
 
@@ -763,26 +796,11 @@ next level and make it work in your environment.
763
  - Publication date: May 11, 2023
764
  - Link: https://mlops.community/fixing-the-mlops-survey-on-llms-with-chatgpt-api-lessons-learned/
765
 
766
- Large Language Model (LLM) is such an existing topic. Since the
767
- release of ChatGPT, we saw a surge of innovation ranging from
768
- education mentorship to finance advisory. Each week is a new
769
- opportunity for addressing new kinds of problems, increasing human
770
- productivity, or improving existing solutions. Yet, we may wonder if
771
- this is just a new hype cycle or if organizations are truly adopting
772
- LLMs at scale …
773
- On March 2023, the MLOps Community issued a survey about LLMs in
774
- production to picture the state of adoption. The survey is full of
775
- interesting insights, but there is a catch: 80% of the questions are
776
- open-ended, which means respondents answered the survey freely from
777
- a few keywords to full sentences. I volunteered to clean up the
778
- answers with the help of ChatGPT and let the community get a grasp
779
- of the survey experiences.
780
- In this article, I present the steps and lessons learned from my
781
- journey to shed some light on the MLOps survey on LLMs. I’m first
782
- going to present the goal and questions of the survey. Then, I will
783
- explain how I used ChatGPT to review the data and standardize the
784
- content. Finally, I’m going to evaluate the performance of ChatGPT
785
- compared to a manual review.
786
 
787
  ## Kubeflow: The Machine Learning Toolkit for Kubernetes
788
 
@@ -802,17 +820,9 @@ compared to a manual review.
802
  - Publication date: April 21, 2023
803
  - Link: https://mlops.community/we-need-posix-for-mlops/
804
 
805
- If you work on MLOps, you must navigate an ever-growing landscape of
806
- tools and solutions. This is both an intense source of stimulation
807
- and fatigue for MLOps practitioners.
808
- Vendors and users face the same problem: How can we combine all
809
- these tools without the combinatorial complexity of creating custom
810
- integrations?
811
- In this article, I propose a solution analogous to POSIX to address
812
- this challenge. First, I motivate the creation of common protocols
813
- and schemas for combining MLOps tools. Second, I present a
814
- high-level architecture to support implementation. Third, I conclude
815
- with the benefits and limitations of standardizing MLOps.
816
 
817
  ## How to install Kubeflow Pipelines v2 on Apple Silicon
818
 
@@ -820,17 +830,9 @@ with the benefits and limitations of standardizing MLOps.
820
  - Publication date: September 24, 2022
821
  - Link: https://fmind.medium.com/how-to-install-kubeflow-on-apple-silicon-3565db8773f3
822
 
823
- Kubeflow Pipelines (KFP) is a powerful platform for building machine
824
- learning pipelines at scale with Kubernetes. The platform is well
825
- supported on major cloud platforms such as GCP (Vertex AI Pipelines)
826
- or AWS (Kubeflow on AWS). However, installing KFP on Apple Silicon
827
- (macOS 12.5.1 with Apple M1 Pro) proved to be more challenging than
828
- I imagined. Thus, I wanted to share my experience and tips to
829
- install KFP as easily as possible on your shiny Mac.
830
- In this article, I present 4 steps to install Kubeflow on Apple
831
- Silicon, using Rancher Desktop for setting up Docker/Kubernetes. In
832
- the end, I list the problems I encountered during the installation
833
- of Kubeflow Pipelines.
834
 
835
  ## The Programming Trade-Off: Purpose, Productivity, Performance
836
 
@@ -838,13 +840,9 @@ of Kubeflow Pipelines.
838
  - Publication: August 15, 2019
839
  - Link: https://fmind.medium.com/3p-principle-purpose-productivity-performance-630bed7623fc
840
 
841
- As programmers, we are continuously looking for languages that are
842
- performant, productive, and general purpose. Is there any
843
- programming language that currently satisfies these properties? Can
844
- we ever create one?
845
- In this article, I present a fundamental trade-off that affects the
846
- design of programming languages and the success of software
847
- projects.
848
 
849
  ## Creating better ground truth to further understand Android malware: A large scale mining approach based on antivirus labels and malicious artifacts
850
 
@@ -852,28 +850,11 @@ projects.
852
  - Publication date: July 1, 2019
853
  - Link: https://orbilu.uni.lu/handle/10993/39903
854
 
855
- Mobile applications are essential for interacting with technology
856
- and other people. With more than 2 billion devices deployed all over
857
- the world, Android offers a thriving ecosystem by making accessible
858
- the work of thousands of developers on digital marketplaces such as
859
- Google Play. Nevertheless, the success of Android also exposes
860
- millions of users to malware authors who seek to siphon private
861
- information and hijack mobile devices for their benefits.
862
- To fight against the proliferation of Android malware, the security
863
- community embraced machine learning, a branch of artificial
864
- intelligence that powers a new generation of detection systems.
865
- Machine learning algorithms, however, require a substantial number
866
- of qualified samples to learn the classification rules enforced by
867
- security experts. Unfortunately, malware ground truths are
868
- notoriously hard to construct due to the inherent complexity of
869
- Android applications and the global lack of public information about
870
- malware. In a context where both information and human resources are
871
- limited, the security community is in demand for new approaches to
872
- aid practitioners to accurately define Android malware, automate
873
- classification decisions, and improve the comprehension of Android
874
- malware.
875
- This dissertation proposes three solutions to assist with the
876
- creation of malware ground truths.
877
 
878
  ## Euphony: Harmonious Unification of Cacophonous Anti-Virus Vendor Labels for Android Malware
879
 
@@ -881,26 +862,9 @@ creation of malware ground truths.
881
  - Publication date: May 21, 2017
882
  - Link: https://orbilu.uni.lu/handle/10993/31441
883
 
884
- Android malware is now pervasive and evolving rapidly. Thousands of
885
- malware samples are discovered every day with new models of attacks.
886
- The growth of these threats has come hand in hand with the
887
- proliferation of collective repositories sharing the latest
888
- specimens. Having access to a large number of samples opens new
889
- research directions aiming at efficiently vetting apps. However,
890
- automatically inferring a reference ground-truth from those
891
- repositories is not straightforward and can inadvertently lead to
892
- unforeseen misconceptions. On the one hand, samples are often
893
- mislabeled as different parties use distinct naming schemes for the
894
- same sample. On the other hand, samples are frequently misclassified
895
- due to conceptual errors made during labeling processes.
896
- In this paper, we analyze the associations between all labels given
897
- by different vendors and we propose a system called EUPHONY to
898
- systematically unify common samples into family groups. The key
899
- novelty of our approach is that no prior knowledge of malware
900
- families is needed. We evaluate our approach using reference
901
- datasets and more than 0.4 million additional samples outside of
902
- these datasets. Results show that EUPHONY provides competitive
903
- performance against the state-of-the-art.
904
 
905
  ## On the Lack of Consensus in Anti-Virus Decisions: Metrics and Insights on Building Ground Truths of Android Malware
906
 
@@ -908,31 +872,21 @@ performance against the state-of-the-art.
908
  - Publication date: July 7, 2016
909
  - Link: https://orbilu.uni.lu/handle/10993/27845
910
 
911
- There is generally a lack of consensus in Antivirus (AV) engines'
912
- decisions on a given sample. This challenges the building of
913
- authoritative ground-truth datasets. Instead, researchers and
914
- practitioners may rely on unvalidated approaches to build their
915
- ground truth, e.g., by considering decisions from a selected set of
916
- Antivirus vendors or by setting up a threshold number of positive
917
- detections before classifying a sample. Both approaches are biased
918
- as they implicitly either decide on ranking AV products, or they
919
- consider that all AV decisions have equal weights. In this paper, we
920
- extensively investigate the lack of agreement among AV engines.
921
- To that end, we propose a set of metrics that quantitatively
922
- describe the different dimensions of this lack of consensus. We show
923
- how our metrics can bring important insights by using the detection
924
- results of 66 AV products on 2 million Android apps as a case study.
925
- Our analysis focuses not only on AV binary decision but also on the
926
- notoriously hard problem of labels that AVs associate with
927
- suspicious files, and allows to highlight biases hidden in the
928
- collection of a malware ground truth---a foundation stone of any
929
- machine learning-based malware detection approach.
930
 
931
  # Projects
932
 
 
 
 
 
 
 
933
  ## MLOps Python Package
934
 
935
- - Date: Jun 2023 - Jun 2023
936
  - Description: Kickstart your MLOps initiative with a flexible, robust, and productive Python package.
937
  - Link: https://github.com/fmind/mlops-python-package
938
 
@@ -944,144 +898,144 @@ machine learning-based malware detection approach.
944
 
945
  ## Kubeflow Demo
946
 
947
- - Date: Apr 2023 - Apr 2023
948
  - Description: Kubeflow demo for the MLOps Community Meetup in Luxembourg.
949
  - Link: https://github.com/fmind/kubeflow-demo
950
 
951
  ## MLflow Demo
952
 
953
- - Date: Apr 2023 - Apr 2023
954
  - Description: MLflow demo for the MLOps Community Meetup in Luxembourg.
955
  - Link: https://github.com/fmind/mlflow-demo
956
 
957
  ## onet
958
 
959
- - Date: Aug 2020 - Sep 2020
960
  - Description: Train and predict procedures of DNN for binary image classification
961
  - Link: https://github.com/fmind/onet
962
 
963
  ## fincrawl
964
 
965
- - Date: Nov 2019 - Dec 2019
966
  - Description: Crawl documents, metadata, and files from financial institutions
967
  - Link: https://github.com/fmind/fincrawl
968
 
969
  ## invest
970
 
971
- - Date: Aug 2019 - Sep 2019
972
  - Description: Stock market analysis focused on dividends
973
  - Link: https://github.com/fmind/invest
974
 
975
  ## parsoc
976
 
977
- - Date: Jul 2019 - Sep 2019
978
  - Description: Convert docx files to json
979
  - Link: https://github.com/fmind/parsoc
980
 
981
  ## Bigdata Tutorials
982
 
983
- - Date: Sep 2015 - Jul 2019
984
  - Description: Tutorials for the Big Data course @ uni.lu
985
  - Link: https://github.com/fmind/bigdata-tutorials
986
 
987
  ## STASE: A set of statistical metrics to better understand and qualify malware datasets
988
 
989
- - Date: Apr 2016 - Jul 2019
990
  - Description: A handful of statistical metrics to better understand and qualify malware datasets
991
  - Link: https://github.com/fmind/STASE
992
 
993
  ## apkworkers
994
 
995
- - Date: Sep 2015 - Jul 2019
996
  - Description: A celery application to distribute Android malware analysis
997
  - Link: https://github.com/fmind/apkworkers
998
 
999
  ## servalx
1000
 
1001
- - Date: Sep 2015 - Jul 2019
1002
  - Description: A set of tools and modules to process Android malware with Androzoo
1003
  - Link: https://github.com/fmind/servalx
1004
 
1005
  ## Euphony: Harmonious Unification of Cacophonous Anti-Virus Vendor Labels for Android Malware
1006
 
1007
- - Date: Mar 2017 - Mar 2019
1008
  - Description: Harmonious Unification of Cacophonous Anti-Virus Vendor Labels for Android Malware
1009
  - Link: https://github.com/fmind/euphony
1010
 
1011
  ## Automatic Speech Recognition with Tensorflow
1012
 
1013
- - Date: Sep 2017 - Sep 2017
1014
  - Description: An automatic speech-recognition system based on Tensorflow
1015
  - Link: https://github.com/fmind/AIND-VUI-Capstone
1016
 
1017
  ## Dog Recognition with Tensorflow
1018
 
1019
- - Date: Aug 2017 - Aug 2017
1020
  - Description: A machine-learning model train to recognize dogs, even from human faces
1021
  - Link: https://github.com/fmind/dog-project
1022
 
1023
  ## genius
1024
 
1025
- - Date: Jun 2017 - Jul 2017
1026
  - Description: An implementation of LISP Scheme based on Haskell
1027
  - Link: https://github.com/fmind/genius
1028
 
1029
  ## Alexa History Skill
1030
 
1031
- - Date: Jun 2017 - Jun 2017
1032
  - Description: A Alexa skill that provides year-dated facts on demand
1033
  - Link: https://github.com/fmind/AIND-VUI-Alexa
1034
 
1035
  ## Air Cargo Planning System
1036
 
1037
- - Date: Feb 2017 - Apr 2017
1038
  - Description: An automated Air Cargo transport system based on AI planning
1039
  - Link: https://github.com/fmind/AIND-Planning
1040
 
1041
  ## Sign Language Recognition System
1042
 
1043
- - Date: Feb 2017 - Apr 2017
1044
  - Description: A sign recognition system based on Hidden Markov Model
1045
  - Link: https://github.com/fmind/AIND-Recognizer
1046
 
1047
  ## AI Agent for the Isolation Game
1048
 
1049
- - Date: Mar 2017 - Mar 2017
1050
  - Description: An AI game agent to play the Isolation game
1051
  - Link: https://github.com/fmind/AIND-Isolation
1052
 
1053
  ## Sudoku Solver
1054
 
1055
- - Date: Jan 2017 - Feb 2017
1056
  - Description: A Diagonal Sudoku solver implemented with Python
1057
  - Link: https://github.com/fmind/AIND-Sudoku
1058
 
1059
  ## lkml
1060
 
1061
- - Date: Nov 2016 - Jan 2017
1062
  - Description: Gather emails from https://lkml.org/
1063
  - Link: https://github.com/fmind/lkml
1064
 
1065
  ## Master 2 School Projects
1066
 
1067
- - Date: Sep 2013 - Jun 2014
1068
  - Description: School projects from 2013 to 2014 - Master 2 Sécurité des Systèmes d'Information (Metz)
1069
  - Link: https://github.com/fmind/master2-projects
1070
 
1071
  ## chattail
1072
 
1073
- - Date: Dec 2013 - Mar 2014
1074
  - Description: Send log streams over XMPP to monitor your systems
1075
  - Link: https://github.com/fmind/chattail
1076
 
1077
  ## Master 1 School Projects
1078
 
1079
- - Date: Jun 2012 - Sep 2013
1080
  - Link: https://github.com/fmind/master1-projects
1081
 
1082
  ## Bachelor School Projects
1083
 
1084
- - Date: Jun 2011 - Sep 2012
1085
  - Link: https://github.com/fmind/bachelor-projects
1086
 
1087
  ## Professional Bachelor School Project
@@ -1099,7 +1053,6 @@ machine learning-based malware detection approach.
1099
  - Deep Learning
1100
  - Data Science
1101
  - Statistics
1102
- - ChatGPT
1103
  - Scikit-Learn
1104
  - Tensorflow
1105
  - KubeFlow
@@ -1107,10 +1060,16 @@ machine learning-based malware detection approach.
1107
  - Jupyter
1108
  - Pandas
1109
  - Keras
1110
- - DVC
1111
  - Transformers
1112
  - Natural Language Processing (NLP)
1113
 
 
 
 
 
 
 
 
1114
  ## Software Engineering
1115
 
1116
  - Python
@@ -1119,6 +1078,7 @@ machine learning-based malware detection approach.
1119
  - API REST
1120
  - Android
1121
  - Docker
 
1122
  - JSON
1123
  - Git
1124
 
@@ -1142,6 +1102,7 @@ machine learning-based malware detection approach.
1142
 
1143
  ## Data Management
1144
 
 
1145
  - NoSQL
1146
  - MongoDB
1147
  - Big Data
@@ -1152,8 +1113,8 @@ machine learning-based malware detection approach.
1152
 
1153
  ## Project Management
1154
 
1155
- - Agile Methodology
1156
  - Project Management
 
1157
  - Jira
1158
  - UML
1159
 
 
5
  - First name: Médéric
6
  - Last name: HURIER
7
  - Pseudo: Fmind
8
+ - City: Luxembourg
9
+ - Country: Luxembourg
 
 
 
10
  - Industry: Technology, Information and Internet
11
+ - Position: Senior MLOps Engineer at Decathlon Technology
12
+ - Education: PhD in Artificial Intelligence and Computer Security from the University of Luxembourg
13
+ - Headline: Freelancer: AI/FM/MLOps Engineer | Data Scientist | MLOps Community Organizer | MLflow Ambassador | Hacker | PhD
14
+ - Note: I'm not available to work on new missions until the 31st of December 2024.
15
 
16
  ## Websites
17
 
18
+ - Website: https://www.fmind.dev
19
+ - Medium: https://fmind.medium.com/
20
+ - GitHub: https://github.com/fmind/
21
  - Twitter: https://twitter.com/fmind_dev
22
+ - HuggingFace: https://huggingface.co/fmind
23
+ - LinkedIn: https://www.linkedin.com/in/fmind-dev
24
 
25
  ## About
26
 
27
+ When I worked as a teacher, I told my students that Artificial Intelligence and Machine Learning are the most effective levers to make a difference. Every day, new AI and ML solutions are released to empower companies and individuals alike. The question is: Is your business ready to provide the best AI/ML products for your customers?
 
28
 
29
+ I'm a professional Machine Learning Engineer, Data Scientist, and MLOps ready to assist you in this quest. I've completed a Ph.D. in Machine Learning and several high-end AI/ML certifications to help you build leading data-driven services. My past experiences include working with companies like Google, BNP Paribas, ArcelorMittal, the European Commission, and Decathlon to frame their needs, create state-of-the-art models and deliver AI/ML artifacts at scale.
 
 
 
 
30
 
31
+ I now work as a freelancer in Luxembourg, and I can carry out missions remotely in other European countries. You can get in touch with me on LinkedIn or at contact@fmind.dev. I'll be happy to collaborate with you or discuss your favored AI/ML topics in the MLOps Community.
 
 
 
 
 
 
 
 
 
 
 
32
 
33
  # Experience
34
 
35
+ ## Senior MLOps Engineer for Decathlon Technology
36
 
37
+ - Title: Senior MLOps Engineer
38
  - Company: Decathlon Technology
39
+ - Period: September 2022 - Present
40
  - Location: Luxembourg (Hybrid)
41
+ - Tasks:
42
+ - Design and implement Decathlon's MLOps platform on top of Databricks and AWS cloud systems.
43
+ - Create code templates and documentations to embed best practices into development processes.
44
+ - Animate Decathlon's MLOps Community through discussions, resources sharing, and maturity matrix.
45
+ - Provide solutions and guidelines to steer the adoption of AI/ML Monitoring/Observability principles.
46
+ - Bring Generative AI capabilities to data scientists and ML engineers through AWS Bedrock/Databricks.
47
+ - Skills: Artificial Intelligence (AI) · Apache Airflow · AWS SageMaker · MLflow · Python · ChatGPT · Git · Docker · Kubernetes · Méthodes agiles · AWS Bedrock · Machine Learning · DataBricks · MLOps · Jira · Apache Spark · Terraform
48
+
49
+ ## Mentor for Data Scientist and AI/ML Engineer for OpenClassrooms
50
+
51
+ - Title: Mentor for Data Scientist and AI/ML Engineer
52
+ - Customer: OpenClassrooms
53
+ - Period: Mars 2023 - February 2024
54
  - Location: France (Remote)
55
  - Mission: Tutoring adult students to become data scientists specializing in machine learning.
56
+ - Learning paths:
57
+ - Data Scientist: https://openclassrooms.com/fr/paths/793-data-scientist
58
+ - Machine Learning Engineer: https://openclassrooms.com/fr/paths/794-machine-learning-engineer
59
+ - AI Egnineer: https://openclassrooms.com/fr/paths/795-ai-engineer
60
  - Skills: Artificial Intelligence (AI) · Machine Learning · Python · Deep Learning · Data Science · Statistics · ChatGPT · Big Data · Jupyter · Pandas · Git · Natural Language Processing (NLP) · Scikit-Learn
61
 
62
+ ## Senior Data Scientist & Project Manager at Cronos Europa for the European Commission
63
 
64
+ - Title: Senior Data Scientist & Project Manager
65
  - Company: Cronos Europa
66
  - Customer: European Commission
67
+ - Period: December 2021 - September 2022
68
  - Location: Luxembourg (Hybrid)
69
  - Mission: Enhance the ARACHNE risk scoring tool (fraud detection).
70
  - Main tasks and responsibilities:
71
  - Develop a new version of Arachne using data mining techniques
72
  - Manage the development of the Arachne PoC/Project (SCRUM)
73
+ - Assist data scientists in their projects (Virtual Assistant, NLP, …)
 
74
  - Skills: Artificial Intelligence (AI) · Machine Learning · MLOps · Python · Deep Learning · Data Science · Big Data · Agile Methodology · Project Management · Functional Programming · Jupyter · Pandas · Docker · Jira · Git · PostgreSQL · AWS SageMaker · Flask · UML · API REST · Terraform · Transformers · Natural Language Processing (NLP) · Data Engineering · Microsoft Azure Machine Learning · Neo4j
75
 
76
+ ## Project Manager & Machine Learning Engineer at SFEIR Luxembourg for Decathlon Technology
77
 
78
+ - Title: Project Manager & Machine Learning Engineer
79
  - Company: SFEIR Luxembourg
80
+ - Customer: Decathlon Technology
81
+ - Period: December 2020 - December 2021
82
  - Location: Luxembourg (Remote)
83
  - Mission: Design and implement the next ML/MLOps platform on AWS and GCP.
84
  - Main tasks and responsibilities:
 
93
  - Environments: AWS (SageMaker), GCP (Vertex AI), DataBricks
94
  - Skills: Artificial Intelligence (AI) · Machine Learning · MLOps · Python · Deep Learning · Data Science · Big Data · Agile Methodology · Project Management · Functional Programming · Google Cloud Platform (GCP) · Tensorflow · MLflow · Jupyter · Pandas · Docker · Keras · Jira · Git · DataBricks · Apache Airflow · AWS SageMaker · Flask · UML · Terraform · Data Engineering · Vertex AI (GCP) · Apache Spark · Scikit-Learn · Kubernetes
95
 
96
+ ## Data Scientist at SFEIR Luxembourg
97
 
98
+ - Title: Data Scientist
99
+ - Company: SFEIR Luxembourg
100
+ - Period: October 2020 - November 2020
101
  - Location: Luxembourg (Remote)
102
  - Mission: Improve the visibility and assets of SFEIR's Data Team.
103
  - Main tasks and responsibilities:
 
108
  - Create a group to write tutorials and kata on AI/ML for SFEIR developers.
109
  - Skills: Artificial Intelligence (AI) · Machine Learning · MLOps · Python · Deep Learning · Data Science · Agile Methodology · Functional Programming · Google Cloud Platform (GCP) · Tensorflow · Jupyter · Pandas · Keras · Git · MongoDB · Vertex AI (GCP) · Apache Spark · Scikit-Learn
110
 
111
+ ## Data Scientist at SFEIR Luxembourg for ArcelorMittal
112
 
113
+ - Title: Data Scientist
114
+ - Company: SFEIR Luxembourg
115
  - Customer: ArcelorMittal
116
+ - Period: January 2020 - September 2020
117
  - Location: Luxembourg (Remote)
118
  - Mission: Train and optimize machine learning models to recommend steel prices.
119
  - Main tasks and responsibilities:
 
126
  - Environment: MS-SQL, Azure Cloud, Jira, Papermill
127
  - Skills: Artificial Intelligence (AI) · Machine Learning · MLOps · Python · Data Science · Agile Methodology · Functional Programming · Jupyter · Pandas · Jira · Git · Natural Language Processing (NLP) · Scikit-Learn
128
 
129
+ ## Research And Development Specialist at the University of Luxembourg
130
 
131
+ - Title: Research And Development Specialist
132
  - Company: University of Luxembourg
133
+ - Period: September 2019 - January 2020
134
  - Location: Luxembourg
135
  - Mission: Management and development of Natural Language Understanding (NLU) projects for BGL BNP Paribas.
136
  - Skills: Artificial Intelligence (AI) · Machine Learning · Python · Data Science · Big Data · Functional Programming · Tensorflow · Jupyter · Pandas · Docker · Git · PostgreSQL · Ansible · Flask · UML · JSON · API REST · Transformers · Natural Language Processing (NLP) · Apache Spark · Scikit-Learn
137
 
138
+ ## Doctoral researcher at the University of Luxembourg
139
 
140
+ - Title: Doctoral researcher
141
  - Company: University of Luxembourg
142
+ - Period: September 2015 - January 2020
143
  - Location: Luxembourg
144
  - Missions:
145
  - Research activities focused on Android security and artificial intelligence.
 
147
  - Collaboration with Google, San Francisco on finding malicious Android artifacts.
148
  - Skills: Artificial Intelligence (AI) · Machine Learning · Python · Deep Learning · Data Science · Statistics · Big Data · Cybersecurity · Functional Programming · Jupyter · Pandas · Docker · Git · NoSQL · MongoDB · PostgreSQL · ElasticSearch · Ansible · Flask · JSON · Android · API REST · Natural Language Processing (NLP) · Data Engineering · Apache Spark · Scikit-Learn
149
 
150
+ ## Mentor for Data Scientist for OpenClassrooms
151
 
152
+ - Title: Mentor for Data Scientist
153
+ - Customer: OpenClassrooms
154
+ - Period: August 2018 - December 2019
155
  - Location: France
156
  - Mission: Tutoring adult students to become data scientists specializing in machine learning.
157
  - Skills: Artificial Intelligence (AI) · Machine Learning · Python · Data Science · Jupyter · Pandas · Git · Flask · JSON · API REST · Scikit-Learn
158
 
159
+ ## Security engineer specialized in log management and analysis at Clearstream
160
 
161
+ - Title: Security engineer specialized in log management and analysis
162
  - Company: Clearstream
163
+ - Period: April 2014 - August 2015
164
  - Location: Luxembourg
165
  - Mission: Selection and deployment of a SIEM solution, participating in security incident response.
166
  - Skills: Python · Big Data · ISO 27001 · Cybersecurity · Jupyter · Pandas · Git · ElasticSearch · Data Engineering
167
 
168
  ## Web developer and administrator
169
 
170
+ - Title: Web developer and administrator
171
  - Company: Freaxmind
172
+ - Period: August 2011 - August 2013
173
  - Location: France
174
  - Mission: Various contracts ranging from web development to software maintenance and debugging.
175
  - Skills: Python · Object Oriented Programming (POO) · Git · Ansible · Flask
176
 
177
+ ## Web Developer for Toul'embal (internship)
178
 
179
+ - Title: Web Developer (intern)
180
  - Company: Toul'embal
181
+ - Period: June 2012 - August 2012
182
  - Location: Toul, France
183
  - Mission: Extension of a Prestashop e-commerce website and creation a portfolio website with WordPress.
184
  - Skills: Object Oriented Programming (POO)
185
 
186
+ ## Web Programmer at Empreinte Studio
187
 
188
+ - Title: Web Programmer
189
  - Company: Empreinte Studio
190
+ - Period: October 2010 - August 2011
191
  - Location: Épernay, France
192
  - Mission: Creation of modern website in PHP and MySQL with professional writers and graphic designers.
193
  - Skills: Object Oriented Programming (POO) · Git
194
 
195
+ ## Software Developer for GEOVARIANCES (apprenticeship)
196
 
197
+ - Title: Software Developer (apprentice)
198
  - Company: GEOVARIANCES
199
+ - Period: September 2009 - September 2010
200
  - Location: Avon, France
201
  - Mission: Development of a geostatistic application in C++ and Qt with experienced software engineers.
202
  - Skills: Object Oriented Programming (POO) · Git · UML
203
 
204
+ ## Web Developer for CV Champagne Nicolas Feuillatte (internship)
205
 
206
+ - Title: Web Developer (intern)
207
  - Company: CV Champagne Nicolas Feuillatte
208
+ - Period: April 2009 - August 2009
209
  - Location: Épernay, France
210
  - Mission: Integration of customer and share management modules to J.D. Edwards with PHP and Oracle.
211
  - Skills: Object Oriented Programming (POO)
 
257
  - Location: Reims (France)
258
  - Period: 2003 - 2006
259
 
260
+ # Volunteering
261
 
262
  ## MLOps Community Organizer (Luxembourg)
263
 
264
  - Community: MLOps Community
265
  - Role: Organizer
266
  - Location: Luxembourg
267
+ - Period: November 2022 - present
268
  - Field: Science and Technology
269
+ - Missions:
270
+ - Organize regular meetups and events for the MLOps Community.
271
+ - Coordinate and review the content for the [MLOps Writer Community](https://mlops.notion.site/Writer-Community-3fc2d1a985a743eb895400159ae5b319).
272
+ - Partners: Amazon Web Services (AWS) and the University of Luxembourg.
273
  - Link: https://www.meetup.com/luxembourg-mlops-community/
274
 
275
+ ## MLflow Ambassador
276
+
277
+ - Community: MLflow
278
+ - Role: Ambassador
279
+ - Period: April 2024 - present
280
+ - Field: Science and Technology
281
+ - Mission: Promote the MLflow tools and projects.
282
+ - Link: https://mlflow.org/ambassador
283
+
284
  # Licenses & Certifications
285
 
286
  ## Machine Learning Associate
 
736
 
737
  # Publications
738
 
739
+ ## Make your MLOps code base SOLID with Pydantic and Python’s ABC
740
+
741
+ - Publisher: MLOps Community
742
+ - Publication date: March 20, 2024
743
+ - Link: https://mlops.community/make-your-mlops-code-base-solid-with-pydantic-and-pythons-abc/
744
+
745
+ MLOps projects are straightforward to initiate, but challenging to perfect. While AI/ML projects often start with a notebook for prototyping, deploying them directly in production is often considered poor practice by the MLOps community. Transitioning to a dedicated Python code base is essential for industrializing the project, yet this move presents several challenges: 1) How can we maintain a code base that is robust yet flexible for agile development? 2) Is it feasible to implement proven design patterns while keeping the code base accessible to all developers? 3) How can we leverage Python’s dynamic nature while adopting strong typing practices akin to static languages?
746
+
747
+ Throughout my career, I have thoroughly explored various strategies to make my code base both simple and powerful. In 2009, I had the opportunity to collaborate with seasoned developers and enthusiasts of design patterns in object-oriented languages such as C++ and Java. By 2015, I had devoted hundreds of hours to mastering functional programming paradigms with languages like Clojure (LISP) and Haskell. This journey led me to discover both modern and time-tested practices, which I have applied to my AI/ML projects. I am eager to share these practices and reveal the most effective solutions I’ve encountered.
748
+
749
+ In this article, I propose a method to develop high-quality MLOps projects using Python's ABC and Pydantic. I begin by emphasizing the importance of implementing SOLID software practices in AI/ML codebases. Next, I offer some background on design patterns and the SOLID principles. Then, I recount my experiences with various code architectures and their limitations. Finally, I explain how Python's ABC and Pydantic can enhance the quality of your Python code and facilitate the adoption of sound coding practices.
750
+
751
+ ## Maîtrise du monitoring des modèles IA : bonnes pratiques et solutions
752
+
753
+ - Publisher: La Conférence MLOps
754
+ - Publication date: March 7, 2024
755
+ - Link: https://conference-mlops.com/talks/maitrise-monitoring-modeles-ia/
756
+
757
+ Le monitoring des modèles de machine learning est indispensable pour valider leurs performances et leurs comportements en production. De nombreuses solutions existent sur le marché, disposant de leurs avantages et inconvénients. Dans cette présentation, nous vous proposons de revoir les critères importants pour sélectionner une solution de monitoring adaptée à votre environnement. Dans un second temps, nous ferons un retour d’expérience sur les technos et outils que nous avons testés. Finalement, nous présenterons les choix d’architectures pour la mise en place du monitoring de modèles à Decathlon.
758
+
759
+ ## Become the Maestro of your MLOps Abstractions🤔
760
+
761
+ - Publisher: MLOps Community
762
+ - Publication date: February 5, 2024
763
+ - Link: https://mlops.community/become-the-maestro-of-your-mlops-abstractions/
764
+
765
+ In this article, I aim to delineate a roadmap for constructing robust MLOps platforms and projects. Initially, I will underscore the importance of devising and mastering your own MLOps abstractions. Following this, I will outline key design patterns essential for forging simple yet potent abstractions for your projects. Lastly, I will delve into real-world case studies, illustrating the critical role of abstractions in the success of various projects.
766
+
767
+ ## How to configure VS Code for AI, ML and MLOps development in Python 🛠️️
768
+
769
+ - Publisher: MLOps Community
770
+ - Publication date: November 29, 2023
771
+ - Link: https://mlops.community/how-to-configure-vs-code-for-ai-ml-and-mlops-development-in-python-%f0%9f%9b%a0%ef%b8%8f%ef%b8%8f/
772
+
773
+ In this article, I outline the steps for configuring VS Code for data scientists and machine learning engineers. I start by listing extensions that augmente your programming environment. Then, I share some settings and keybindings to enhance your development experience. Finally, I provide tips and tricks to boost your coding efficiency with VS Code.
774
+
775
  ## Is AI/ML Monitoring just Data Engineering? 🤔
776
 
777
  - Publisher: MLOps Community
778
  - Publication date: July 24, 2023
779
  - Link: https://mlops.community/is-ai-ml-monitoring-just-data-engineering-%f0%9f%a4%94/
780
 
781
+ While the future of machine learning and MLOps is being debated, practitioners still need to attend to their machine learning models in production. This is no easy task, as ML engineers must constantly assess the quality of the data that enters and exits their pipelines, and ensure that their models generate the correct predictions. To assist ML engineers with this challenge, several AI/ML monitoring solutions have been developed.
782
+
783
+ In this article, I will discuss the nature of AI/ML monitoring and how it relates to data engineering. First, I will present the similarities between AI/ML monitoring and data engineering. Second, I will enumerate additional features that AI/ML monitoring solutions can provide. Third, I will briefly touch on the topic of AI/ML observability and its relation to AI/ML monitoring. Finally, I will provide my conclusion about the field of AI/ML monitoring and how it should be considered to ensure the success of your AI/ML project.
 
 
 
 
 
 
 
 
 
 
 
 
784
 
785
  ## A great MLOps project should start with a good Python Package 🐍
786
 
 
788
  - Publication date: June 28, 2023
789
  - Link: https://mlops.community/a-great-mlops-project-should-start-with-a-good-python-package-%f0%9f%90%8d/
790
 
791
+ In this article, I present the implementation of a Python package on GitHub designed to support MLOps initiatives. The goal of this package is to make the coding workflow of data scientists and ML engineers as flexible, robust, and productive as possible. First, I start by motivating the use of Python packages. Then, I provide some tools and tips you can include in your MLOps project. Finally, I explain the follow-up steps required to take this package to the next level and make it work in your environment.
 
 
 
 
 
 
 
792
 
793
  ## Fixing the MLOps Survey on LLMs with ChatGPT API: Lessons Learned
794
 
 
796
  - Publication date: May 11, 2023
797
  - Link: https://mlops.community/fixing-the-mlops-survey-on-llms-with-chatgpt-api-lessons-learned/
798
 
799
+ Large Language Model (LLM) is such an existing topic. Since the release of ChatGPT, we saw a surge of innovation ranging from education mentorship to finance advisory. Each week is a new opportunity for addressing new kinds of problems, increasing human productivity, or improving existing solutions. Yet, we may wonder if this is just a new hype cycle or if organizations are truly adopting LLMs at scale …
800
+
801
+ On March 2023, the MLOps Community issued a survey about LLMs in production to picture the state of adoption. The survey is full of interesting insights, but there is a catch: 80% of the questions are open-ended, which means respondents answered the survey freely from a few keywords to full sentences. I volunteered to clean up the answers with the help of ChatGPT and let the community get a grasp of the survey experiences.
802
+
803
+ In this article, I present the steps and lessons learned from my journey to shed some light on the MLOps survey on LLMs. I’m first going to present the goal and questions of the survey. Then, I will explain how I used ChatGPT to review the data and standardize the content. Finally, I’m going to evaluate the performance of ChatGPT compared to a manual review.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
804
 
805
  ## Kubeflow: The Machine Learning Toolkit for Kubernetes
806
 
 
820
  - Publication date: April 21, 2023
821
  - Link: https://mlops.community/we-need-posix-for-mlops/
822
 
823
+ If you work on MLOps, you must navigate an ever-growing landscape of tools and solutions. This is both an intense source of stimulation and fatigue for MLOps practitioners. Vendors and users face the same problem: How can we combine all these tools without the combinatorial complexity of creating custom integrations?
824
+
825
+ In this article, I propose a solution analogous to POSIX to address this challenge. First, I motivate the creation of common protocols and schemas for combining MLOps tools. Second, I present a high-level architecture to support implementation. Third, I conclude with the benefits and limitations of standardizing MLOps.
 
 
 
 
 
 
 
 
826
 
827
  ## How to install Kubeflow Pipelines v2 on Apple Silicon
828
 
 
830
  - Publication date: September 24, 2022
831
  - Link: https://fmind.medium.com/how-to-install-kubeflow-on-apple-silicon-3565db8773f3
832
 
833
+ Kubeflow Pipelines (KFP) is a powerful platform for building machine learning pipelines at scale with Kubernetes. The platform is well supported on major cloud platforms such as GCP (Vertex AI Pipelines) or AWS (Kubeflow on AWS). However, installing KFP on Apple Silicon (macOS 12.5.1 with Apple M1 Pro) proved to be more challenging than I imagined. Thus, I wanted to share my experience and tips to install KFP as easily as possible on your shiny Mac.
834
+
835
+ In this article, I present 4 steps to install Kubeflow on Apple Silicon, using Rancher Desktop for setting up Docker/Kubernetes. In the end, I list the problems I encountered during the installation of Kubeflow Pipelines.
 
 
 
 
 
 
 
 
836
 
837
  ## The Programming Trade-Off: Purpose, Productivity, Performance
838
 
 
840
  - Publication: August 15, 2019
841
  - Link: https://fmind.medium.com/3p-principle-purpose-productivity-performance-630bed7623fc
842
 
843
+ As programmers, we are continuously looking for languages that are performant, productive, and general purpose. Is there any programming language that currently satisfies these properties? Can we ever create one?
844
+
845
+ In this article, I present a fundamental trade-off that affects the design of programming languages and the success of software projects.
 
 
 
 
846
 
847
  ## Creating better ground truth to further understand Android malware: A large scale mining approach based on antivirus labels and malicious artifacts
848
 
 
850
  - Publication date: July 1, 2019
851
  - Link: https://orbilu.uni.lu/handle/10993/39903
852
 
853
+ Mobile applications are essential for interacting with technology and other people. With more than 2 billion devices deployed all over the world, Android offers a thriving ecosystem by making accessible the work of thousands of developers on digital marketplaces such as Google Play. Nevertheless, the success of Android also exposes millions of users to malware authors who seek to siphon private information and hijack mobile devices for their benefits.
854
+
855
+ To fight against the proliferation of Android malware, the security community embraced machine learning, a branch of artificial intelligence that powers a new generation of detection systems. Machine learning algorithms, however, require a substantial number of qualified samples to learn the classification rules enforced by security experts. Unfortunately, malware ground truths are notoriously hard to construct due to the inherent complexity of Android applications and the global lack of public information about malware. In a context where both information and human resources are limited, the security community is in demand for new approaches to aid practitioners to accurately define Android malware, automate classification decisions, and improve the comprehension of Android malware.
856
+
857
+ This dissertation proposes three solutions to assist with the creation of malware ground truths.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
858
 
859
  ## Euphony: Harmonious Unification of Cacophonous Anti-Virus Vendor Labels for Android Malware
860
 
 
862
  - Publication date: May 21, 2017
863
  - Link: https://orbilu.uni.lu/handle/10993/31441
864
 
865
+ Android malware is now pervasive and evolving rapidly. Thousands of malware samples are discovered every day with new models of attacks. The growth of these threats has come hand in hand with the proliferation of collective repositories sharing the latest specimens. Having access to a large number of samples opens new research directions aiming at efficiently vetting apps. However, automatically inferring a reference ground-truth from those repositories is not straightforward and can inadvertently lead to unforeseen misconceptions. On the one hand, samples are often mislabeled as different parties use distinct naming schemes for the same sample. On the other hand, samples are frequently misclassified due to conceptual errors made during labeling processes.
866
+
867
+ In this paper, we analyze the associations between all labels given by different vendors and we propose a system called EUPHONY to systematically unify common samples into family groups. The key novelty of our approach is that no prior knowledge of malware families is needed. We evaluate our approach using reference datasets and more than 0.4 million additional samples outside of these datasets. Results show that EUPHONY provides competitive performance against the state-of-the-art.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
868
 
869
  ## On the Lack of Consensus in Anti-Virus Decisions: Metrics and Insights on Building Ground Truths of Android Malware
870
 
 
872
  - Publication date: July 7, 2016
873
  - Link: https://orbilu.uni.lu/handle/10993/27845
874
 
875
+ There is generally a lack of consensus in Antivirus (AV) engines' decisions on a given sample. This challenges the building of authoritative ground-truth datasets. Instead, researchers and practitioners may rely on unvalidated approaches to build their ground truth, e.g., by considering decisions from a selected set of Antivirus vendors or by setting up a threshold number of positive detections before classifying a sample. Both approaches are biased as they implicitly either decide on ranking AV products, or they consider that all AV decisions have equal weights. In this paper, we extensively investigate the lack of agreement among AV engines.
876
+
877
+ To that end, we propose a set of metrics that quantitatively describe the different dimensions of this lack of consensus. We show how our metrics can bring important insights by using the detection results of 66 AV products on 2 million Android apps as a case study. Our analysis focuses not only on AV binary decision but also on the notoriously hard problem of labels that AVs associate with suspicious files, and allows to highlight biases hidden in the collection of a malware ground truth---a foundation stone of any machine learning-based malware detection approach.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
878
 
879
  # Projects
880
 
881
+ ## Keep It Simple Scribe
882
+
883
+ - Date: March 2024 - Present
884
+ - Description: Rewrites blog articles for clarity and simplicity.
885
+ - Link: https://chatgpt.com/g/g-93O8PHtLh-keep-it-simple-scribe
886
+
887
  ## MLOps Python Package
888
 
889
+ - Date: June 2023 - Present
890
  - Description: Kickstart your MLOps initiative with a flexible, robust, and productive Python package.
891
  - Link: https://github.com/fmind/mlops-python-package
892
 
 
898
 
899
  ## Kubeflow Demo
900
 
901
+ - Date: April 2023 - April 2023
902
  - Description: Kubeflow demo for the MLOps Community Meetup in Luxembourg.
903
  - Link: https://github.com/fmind/kubeflow-demo
904
 
905
  ## MLflow Demo
906
 
907
+ - Date: April 2023 - April 2023
908
  - Description: MLflow demo for the MLOps Community Meetup in Luxembourg.
909
  - Link: https://github.com/fmind/mlflow-demo
910
 
911
  ## onet
912
 
913
+ - Date: August 2020 - September 2020
914
  - Description: Train and predict procedures of DNN for binary image classification
915
  - Link: https://github.com/fmind/onet
916
 
917
  ## fincrawl
918
 
919
+ - Date: November 2019 - December 2019
920
  - Description: Crawl documents, metadata, and files from financial institutions
921
  - Link: https://github.com/fmind/fincrawl
922
 
923
  ## invest
924
 
925
+ - Date: August 2019 - September 2019
926
  - Description: Stock market analysis focused on dividends
927
  - Link: https://github.com/fmind/invest
928
 
929
  ## parsoc
930
 
931
+ - Date: July 2019 - September 2019
932
  - Description: Convert docx files to json
933
  - Link: https://github.com/fmind/parsoc
934
 
935
  ## Bigdata Tutorials
936
 
937
+ - Date: September 2015 - July 2019
938
  - Description: Tutorials for the Big Data course @ uni.lu
939
  - Link: https://github.com/fmind/bigdata-tutorials
940
 
941
  ## STASE: A set of statistical metrics to better understand and qualify malware datasets
942
 
943
+ - Date: Aprril 2016 - July 2019
944
  - Description: A handful of statistical metrics to better understand and qualify malware datasets
945
  - Link: https://github.com/fmind/STASE
946
 
947
  ## apkworkers
948
 
949
+ - Date: September 2015 - July 2019
950
  - Description: A celery application to distribute Android malware analysis
951
  - Link: https://github.com/fmind/apkworkers
952
 
953
  ## servalx
954
 
955
+ - Date: September 2015 - July 2019
956
  - Description: A set of tools and modules to process Android malware with Androzoo
957
  - Link: https://github.com/fmind/servalx
958
 
959
  ## Euphony: Harmonious Unification of Cacophonous Anti-Virus Vendor Labels for Android Malware
960
 
961
+ - Date: March 2017 - March 2019
962
  - Description: Harmonious Unification of Cacophonous Anti-Virus Vendor Labels for Android Malware
963
  - Link: https://github.com/fmind/euphony
964
 
965
  ## Automatic Speech Recognition with Tensorflow
966
 
967
+ - Date: September 2017 - September 2017
968
  - Description: An automatic speech-recognition system based on Tensorflow
969
  - Link: https://github.com/fmind/AIND-VUI-Capstone
970
 
971
  ## Dog Recognition with Tensorflow
972
 
973
+ - Date: August 2017 - August 2017
974
  - Description: A machine-learning model train to recognize dogs, even from human faces
975
  - Link: https://github.com/fmind/dog-project
976
 
977
  ## genius
978
 
979
+ - Date: June 2017 - July 2017
980
  - Description: An implementation of LISP Scheme based on Haskell
981
  - Link: https://github.com/fmind/genius
982
 
983
  ## Alexa History Skill
984
 
985
+ - Date: June 2017 - June 2017
986
  - Description: A Alexa skill that provides year-dated facts on demand
987
  - Link: https://github.com/fmind/AIND-VUI-Alexa
988
 
989
  ## Air Cargo Planning System
990
 
991
+ - Date: February 2017 - April 2017
992
  - Description: An automated Air Cargo transport system based on AI planning
993
  - Link: https://github.com/fmind/AIND-Planning
994
 
995
  ## Sign Language Recognition System
996
 
997
+ - Date: February 2017 - April 2017
998
  - Description: A sign recognition system based on Hidden Markov Model
999
  - Link: https://github.com/fmind/AIND-Recognizer
1000
 
1001
  ## AI Agent for the Isolation Game
1002
 
1003
+ - Date: March 2017 - March 2017
1004
  - Description: An AI game agent to play the Isolation game
1005
  - Link: https://github.com/fmind/AIND-Isolation
1006
 
1007
  ## Sudoku Solver
1008
 
1009
+ - Date: January 2017 - February 2017
1010
  - Description: A Diagonal Sudoku solver implemented with Python
1011
  - Link: https://github.com/fmind/AIND-Sudoku
1012
 
1013
  ## lkml
1014
 
1015
+ - Date: November 2016 - January 2017
1016
  - Description: Gather emails from https://lkml.org/
1017
  - Link: https://github.com/fmind/lkml
1018
 
1019
  ## Master 2 School Projects
1020
 
1021
+ - Date: September 2013 - June 2014
1022
  - Description: School projects from 2013 to 2014 - Master 2 Sécurité des Systèmes d'Information (Metz)
1023
  - Link: https://github.com/fmind/master2-projects
1024
 
1025
  ## chattail
1026
 
1027
+ - Date: Dececember 2013 - March 2014
1028
  - Description: Send log streams over XMPP to monitor your systems
1029
  - Link: https://github.com/fmind/chattail
1030
 
1031
  ## Master 1 School Projects
1032
 
1033
+ - Date: June 2012 - September 2013
1034
  - Link: https://github.com/fmind/master1-projects
1035
 
1036
  ## Bachelor School Projects
1037
 
1038
+ - Date: June 2011 - September 2012
1039
  - Link: https://github.com/fmind/bachelor-projects
1040
 
1041
  ## Professional Bachelor School Project
 
1053
  - Deep Learning
1054
  - Data Science
1055
  - Statistics
 
1056
  - Scikit-Learn
1057
  - Tensorflow
1058
  - KubeFlow
 
1060
  - Jupyter
1061
  - Pandas
1062
  - Keras
 
1063
  - Transformers
1064
  - Natural Language Processing (NLP)
1065
 
1066
+ ## Generative AI
1067
+
1068
+ - Retrieval-Augmented Generation (RAG)
1069
+ - Large Language Model (LLM)
1070
+ - AWS Bedrock
1071
+ - ChatGPT
1072
+
1073
  ## Software Engineering
1074
 
1075
  - Python
 
1078
  - API REST
1079
  - Android
1080
  - Docker
1081
+ - Flask
1082
  - JSON
1083
  - Git
1084
 
 
1102
 
1103
  ## Data Management
1104
 
1105
+ - Neo4j
1106
  - NoSQL
1107
  - MongoDB
1108
  - Big Data
 
1113
 
1114
  ## Project Management
1115
 
 
1116
  - Project Management
1117
+ - Agile Methodology
1118
  - Jira
1119
  - UML
1120
 
files/linkedin.txt DELETED
@@ -1,1937 +0,0 @@
1
- Skip to main content
2
-
3
- Agree & Join LinkedIn
4
-
5
- By clicking Continue, you agree to LinkedIn’s User Agreement, Privacy
6
- Policy, and Cookie Policy.
7
-
8
- Skip to main content
9
-
10
- LinkedIn
11
-
12
- - Articles
13
- - People
14
- - Learning
15
- - Jobs
16
-
17
- Join now Sign in
18
-
19
- []
20
-
21
- Médéric HURIER
22
-
23
- Freelancer: AI/ML/MLOps Engineer | Data Scientist | MLOps Community Organizer | OpenClassrooms Mentor | Hacker | PhD
24
-
25
- Luxembourg, Luxembourg, Luxembourg
26
-
27
- 4K followers 500+ connections
28
-
29
- See your mutual connections
30
-
31
- View mutual connections with Médéric
32
-
33
- Sign in
34
-
35
- Welcome back
36
-
37
- Email or phone
38
-
39
- Password
40
-
41
- Show
42
-
43
- Forgot password?
44
-
45
- Sign in
46
-
47
- or
48
-
49
- By clicking Continue, you agree to LinkedIn’s User Agreement, Privacy
50
- Policy, and Cookie Policy.
51
-
52
- New to LinkedIn? Join now
53
-
54
- or
55
-
56
- By clicking Continue, you agree to LinkedIn’s User Agreement, Privacy
57
- Policy, and Cookie Policy.
58
-
59
- New to LinkedIn? Join now
60
-
61
- Sign in to connect
62
-
63
- Sign in to view Médéric’s full profile
64
-
65
- Sign in
66
-
67
- Welcome back
68
-
69
- Email or phone
70
-
71
- Password
72
-
73
- Show
74
-
75
- Forgot password?
76
-
77
- Sign in
78
-
79
- or
80
-
81
- By clicking Continue, you agree to LinkedIn’s User Agreement, Privacy
82
- Policy, and Cookie Policy.
83
-
84
- New to LinkedIn? Join now
85
-
86
- or
87
-
88
- By clicking Continue, you agree to LinkedIn’s User Agreement, Privacy
89
- Policy, and Cookie Policy.
90
-
91
- New to LinkedIn? Join now
92
-
93
- Decathlon Technology
94
-
95
- University of Luxembourg
96
-
97
- Websites
98
-
99
- Websites
100
-
101
- Company Website
102
- https://www.fmind.dev
103
-
104
- Portfolio
105
- https://github.com/fmind/
106
-
107
- Blog
108
- https://fmind.medium.com/
109
-
110
- - Report this profile
111
-
112
- About
113
-
114
- Note: I'm not available to work on new missions until the 1st of
115
- September 2023. Thank you for your understanding.
116
- When I worked as a teacher, I told my students that Artificial
117
- Intelligence and Machine Learning are the most effective levers to make
118
- a difference. Every day, new AI and ML solutions are released to empower
119
- companies and individuals alike. The question is: Is your business ready
120
- to provide the best AI/ML products for your customers?
121
- I'm a professional Machine Learning Engineer, Data Scientist, and MLOps
122
- ready to assist you in this quest. I've completed a Ph.D. in Machine
123
- Learning and several high-end AI/ML certifications to help you build
124
- leading data-driven services. My past experiences include working with
125
- companies like Google, BNP Paribas, ArcelorMittal, the European
126
- Commission, and Decathlon to frame their needs, create state-of-the-art
127
- models and deliver AI/ML artifacts at scale.
128
- I now work as a freelancer in Luxembourg, and I can carry out missions
129
- remotely in other European countries. You can get in touch with me on
130
- LinkedIn or at contact@fmind.dev. I'll be happy to collaborate with you
131
- or discuss your favored AI/ML topics in the MLOps Community.
132
-
133
- Experience
134
-
135
- -
136
- Lead MLOps Engineer
137
-
138
- Decathlon Technology
139
-
140
- Sep 2022 - Present1 year 2 months
141
-
142
- Luxembourg
143
-
144
- Continue the design and implementation of Decathlon's MLOps platform
145
- with Databricks and AWS.
146
-
147
- -
148
- Mentor for aspiring Data Scientist and AI/ML Engineer
149
-
150
- OpenClassrooms
151
-
152
- Mar 2023 - Present8 months
153
-
154
- France
155
-
156
- Tutoring adult students to become data scientists specializing in
157
- machine learning.
158
- - https://openclassrooms.com/fr/paths/793-data-scientist
159
- - https://openclassrooms.com/fr/paths/794-machine-learning-engineer
160
- - https://openclassrooms.com/fr/paths/795-ai-engineer
161
-
162
- -
163
- Senior Data Scientist & Project Manager for the European Commission
164
-
165
- Cronos Europa
166
-
167
- Dec 2021 - Sep 202210 months
168
-
169
- Luxembourg
170
-
171
- Mission: Enhance the ARACHNE risk scoring tool (fraud detection).
172
- Main tasks and responsibilities:
173
- - Develop a new version of Arachne using data mining techniques
174
- - Manage the development of the Arachne PoC/Project (SCRUM)
175
- - Assist data scientists in their projects (Virtual Assistant, NLP,
176
- …)
177
- Technical stack:
178
- - Data Science: Python, PostgreSQL, SQLAlchemy, Hugging Face,
179
- HayStack
180
- - Management/Environment: Jira, Confluence, MS Office, AWS, Azure
181
-
182
- -
183
-
184
- SFEIR
185
-
186
- 2 years
187
-
188
- -
189
- Project Manager & Machine Learning Engineer for Decathlon
190
-
191
- SFEIR
192
-
193
- Dec 2020 - Dec 20211 year 1 month
194
-
195
- Luxembourg
196
-
197
- Mission: Design and implement the next ML/MLOps platform on AWS
198
- and GCP.
199
- Main tasks and responsibilities:
200
- - Design the functional & technical architecture of the platform
201
- - Manage the MLOps@Decathlon initiative (tasks, plannings)
202
- - Select the vendor solutions based on a user need analysis
203
- - Communicate the progress and success to stack-holders
204
- - Assist data scientists in their project (audience, forecast)
205
- Technical stack:
206
- - Data Science: Python, TensorFlow… Show more
207
-
208
- Mission: Design and implement the next ML/MLOps platform on AWS
209
- and GCP.
210
- Main tasks and responsibilities:
211
- - Design the functional & technical architecture of the platform
212
- - Manage the MLOps@Decathlon initiative (tasks, plannings)
213
- - Select the vendor solutions based on a user need analysis
214
- - Communicate the progress and success to stack-holders
215
- - Assist data scientists in their project (audience, forecast)
216
- Technical stack:
217
- - Data Science: Python, TensorFlow, Spark, sklearn, Jupyter,
218
- Airflow
219
- - Management: Google Workspace, Jira, UML, Terraform, Jenkins
220
- - Environments: AWS (SageMaker), GCP (Vertex AI), DataBricks
221
- Show less
222
- -
223
- Data Scientist for SFEIR
224
-
225
- SFEIR
226
-
227
- Oct 2020 - Nov 20202 months
228
-
229
- Luxembourg, Luxembourg
230
-
231
- Mission: Improve the visibility and assets of SFEIR's Data Team.
232
- Main tasks and responsibilities:
233
- - Design and create technical interviews for recruiting data
234
- scientists.
235
- - Become a Professional Machine Learning Engineer on Google
236
- Cloud.
237
- - Propose a strategy to improve the online visibility of SFEIR
238
- data team.
239
- - Share knowledge about data trends with non-technical staff
240
- members.
241
- - Create a group to write tutorials and kata on AI/ML for SFEIR
242
- developers.
243
- -
244
- Data Scientist for ArcelorMittal
245
-
246
- SFEIR
247
-
248
- Jan 2020 - Sep 20209 months
249
-
250
- Luxembourg
251
-
252
- Mission: Train and optimize machine learning models to recommend
253
- steel prices.
254
- Main tasks and responsibilities:
255
- - Create and fine-tune machine-learning models (tree-based)
256
- - Evaluate the performance of the model on real datasets
257
- - Communicate the results to business stack-holders
258
- Technical stack:
259
- - Data Science: Python, XGBoost, sklearn, Jupyter, SQL
260
- - Analytics: Matplotlib, Seaborn, Tableau, Plotly, Dash
261
- - Environment: MS-SQL, Azure Cloud, Jira, Papermill
262
-
263
- -
264
-
265
- University of Luxembourg
266
-
267
- 4 years 5 months
268
-
269
- -
270
- Research And Development Specialist
271
-
272
- University of Luxembourg
273
-
274
- Sep 2019 - Jan 20205 months
275
-
276
- Luxembourg, Luxembourg
277
-
278
- Management and development of Natural Language Understanding
279
- (NLU) projects for BGL BNP Paribas.
280
- -
281
- Doctoral researcher
282
-
283
- University of Luxembourg
284
-
285
- Sep 2015 - Jan 20204 years 5 months
286
-
287
- Luxembourg, Luxembourg
288
-
289
- Research activities focused on Android security and artificial
290
- intelligence.
291
- Teaching big data, machine learning and Android programming to
292
- students.
293
- Collaboration with Google, San Francisco on finding malicious
294
- Android artifacts.
295
-
296
- -
297
- Mentor for aspiring Data Scientist
298
-
299
- OpenClassrooms
300
-
301
- Aug 2018 - Dec 20191 year 5 months
302
-
303
- France
304
-
305
- Tutoring adult students to become data scientists specializing in
306
- machine learning.
307
-
308
- -
309
- Security engineer specialized in log management and analysis
310
-
311
- Clearstream
312
-
313
- Apr 2014 - Aug 20151 year 5 months
314
-
315
- Luxembourg, Luxembourg
316
-
317
- Selection and deployment of a SIEM solution, participating in
318
- security incident response.
319
-
320
- - Web developer and administrator
321
-
322
- Freaxmind
323
-
324
- Aug 2011 - Aug 20132 years 1 month
325
-
326
- France
327
-
328
- Various contracts ranging from web development to software
329
- maintenance and debugging.
330
-
331
- -
332
- Web Developer
333
-
334
- Toul'embal
335
-
336
- Jun 2012 - Aug 20123 months
337
-
338
- Toul, France
339
-
340
- Extension of a Prestashop e-commerce website and creation a
341
- portfolio website with WordPress.
342
-
343
- - Web Programmer
344
-
345
- Empreinte Studio
346
-
347
- Oct 2010 - Aug 201111 months
348
-
349
- Épernay, France
350
-
351
- Creation of modern website in PHP and MySQL with professional
352
- writers and graphic designers.
353
-
354
- -
355
- Software Developer
356
-
357
- GEOVARIANCES
358
-
359
- Sep 2009 - Sep 20101 year 1 month
360
-
361
- Avon, France
362
-
363
- Development of a geostatistic application in C++ and Qt with
364
- experienced software engineers.
365
-
366
- -
367
- Web Developer
368
-
369
- CV Champagne Nicolas Feuillatte
370
-
371
- Apr 2009 - Aug 20095 months
372
-
373
- Épernay, France
374
-
375
- Integration of customer and share management modules to J.D. Edwards
376
- with PHP and Oracle.
377
-
378
- Education
379
-
380
- -
381
- University of Luxembourg
382
-
383
- Doctor of Philosophy - PhDComputer Security and Artificial IntelligenceVery Good
384
-
385
- 2015 - 2019
386
-
387
- Activities and Societies: Teach Big Data and Android to students.
388
-
389
- Thesis title: Creating better ground truth to further understand
390
- Android malware
391
-
392
- - UFR Mathématiques, Informatique, Mécanique et Automatique, Metz (France)
393
-
394
- Master's degreecomputer and information systems security
395
-
396
- 2013 - 2014
397
-
398
- - UFR Mathématiques et Informatique de l’Université de Lorraine, Nancy (France)
399
-
400
- Bachelor and master yearscomputer science applied to business informatics
401
-
402
- 2011 - 2013
403
-
404
- - IUT Sénart-Fontainebleau, Fontainebleau (France)
405
-
406
- Professional bachelor's degreecomputer security and databases
407
-
408
- 2009 - 2010
409
-
410
- - IUT Nancy-Charlemagne, Nancy (France)
411
-
412
- Professional bachelor’s degreeweb development and integration
413
-
414
- 2008 - 2009
415
-
416
- - Lycée François 1er, Vitry-le-François (France)
417
-
418
- Technical degreenetwork and software development
419
-
420
- 2006 - 2008
421
-
422
- - Lycée Marc Chagall, Reims (France)
423
-
424
- Baccalauréat général degreescience, specialized in biology
425
-
426
- 2003 - 2006
427
-
428
- Volunteer Experience
429
-
430
- - MLOps Community Organizer (Luxembourg)
431
- MLOps Community Organizer (Luxembourg)
432
-
433
- MLOps Community
434
-
435
- Nov 2022
436
-
437
- Science and Technology
438
-
439
- Organize regular meetups and events for the MLOps Community.
440
- Regular partnership with AWS and the University of Luxembourg.
441
- https://www.meetup.com/luxembourg-mlops-community/
442
-
443
- Licenses & Certifications
444
-
445
- - Machine Learning Associate
446
-
447
- Databricks
448
-
449
- Issued Nov 2022
450
-
451
- Credential ID 61461287
452
-
453
- See credential
454
-
455
- - Databricks Lakehouse Fundamentals
456
-
457
- Databricks
458
-
459
- Issued Oct 2022
460
-
461
- Credential ID 61029028
462
-
463
- See credential
464
-
465
- - Architecting with Google Kubernetes Engine Specialization
466
-
467
- Google
468
-
469
- Issued Sep 2022
470
-
471
- Credential ID WLU4DBPSQ4B5
472
-
473
- See credential
474
-
475
- - Architecting with Google Kubernetes Engine: Foundations
476
-
477
- Google
478
-
479
- Issued Sep 2022
480
-
481
- Credential ID DFWAC6BXLNGL
482
-
483
- See credential
484
-
485
- - Architecting with Google Kubernetes Engine: Production
486
-
487
- Google
488
-
489
- Issued Sep 2022
490
-
491
- Credential ID K5SZHUST5HP2
492
-
493
- See credential
494
-
495
- - Architecting with Google Kubernetes Engine: Workloads
496
-
497
- Google
498
-
499
- Issued Sep 2022
500
-
501
- Credential ID ULJQAXGDVKYK
502
-
503
- See credential
504
-
505
- - Google Cloud Fundamentals: Core Infrastructure
506
-
507
- Google
508
-
509
- Issued Sep 2022
510
-
511
- Credential ID 4CE8WQ6AWKFF
512
-
513
- See credential
514
-
515
- - Iterative Tools for Data Scientists and Analysts
516
-
517
- Iterative
518
-
519
- Issued Aug 2022
520
-
521
- Credential ID 62fcb79418f51945ea
522
-
523
- See credential
524
-
525
- - Azure Data Scientist Associate
526
-
527
- Microsoft
528
-
529
- Issued Jul 2022
530
-
531
- Credential ID 992564946
532
-
533
- See credential
534
-
535
- - Azure Machine Learning for Data Scientists
536
-
537
- Microsoft
538
-
539
- Issued Jun 2022
540
-
541
- Credential ID MZKV7LSTQ9HX
542
-
543
- See credential
544
-
545
- - Build and Operate Machine Learning Solutions with Azure Microsoft
546
-
547
- Microsoft
548
-
549
- Issued Jun 2022
550
-
551
- Credential ID 7FBX68MH272C
552
-
553
- See credential
554
-
555
- - Create Machine Learning Models in Microsoft Azure
556
-
557
- Microsoft
558
-
559
- Issued Jun 2022
560
-
561
- Credential ID SHALM9PM3MPX
562
-
563
- See credential
564
-
565
- - Microsoft Azure Data Scientist Associate - DP-100 Test Prep Specialization
566
-
567
- Microsoft
568
-
569
- Issued Jun 2022
570
-
571
- Credential ID L5P3TYLAYLLT
572
-
573
- See credential
574
-
575
- - Perform data science with Azure Databricks
576
-
577
- Microsoft
578
-
579
- Issued Jun 2022
580
-
581
- Credential ID RQ7PLFYZVLXX
582
-
583
- See credential
584
-
585
- - Prepare for DP-100: Data Science on Microsoft Azure Exam
586
-
587
- Microsoft
588
-
589
- Issued Jun 2022
590
-
591
- Credential ID K5KW27AVMYS2
592
-
593
- See credential
594
-
595
- - Neo4j Graph Data Science Certified
596
-
597
- Neo4j
598
-
599
- Issued Apr 2022
600
-
601
- Credential ID 17351346
602
-
603
- See credential
604
-
605
- - Microsoft Certified: Azure AI Fundamentals
606
-
607
- Microsoft
608
-
609
- Issued Jan 2022
610
-
611
- Credential ID 1098-0884
612
-
613
- See credential
614
-
615
- - Artificial Intelligence on Microsoft Azure
616
-
617
- Microsoft
618
-
619
- Issued Dec 2021
620
-
621
- Credential ID Z8FSWXBSAGLD
622
-
623
- See credential
624
-
625
- - Computer Vision in Microsoft Azure
626
-
627
- Microsoft
628
-
629
- Issued Dec 2021
630
-
631
- Credential ID KDDPYLKM2DA5
632
-
633
- See credential
634
-
635
- - Microsoft Azure AI Fundamentals AI-900 Exam Prep Specialization
636
-
637
- Microsoft
638
-
639
- Issued Dec 2021
640
-
641
- Credential ID 96944QKZH9BU
642
-
643
- See credential
644
-
645
- - Microsoft Azure Machine Learning
646
-
647
- Microsoft
648
-
649
- Issued Dec 2021
650
-
651
- Credential ID 32ES25845Q55
652
-
653
- See credential
654
-
655
- - Natural Language Processing in Microsoft Azure
656
-
657
- Microsoft
658
-
659
- Issued Dec 2021
660
-
661
- Credential ID XVN23N8CKRGY
662
-
663
- See credential
664
-
665
- - Preparing for AI-900: Microsoft Azure AI Fundamentals exam
666
-
667
- Microsoft
668
-
669
- Issued Dec 2021
670
-
671
- Credential ID YC83C22L8TBL
672
-
673
- See credential
674
-
675
- - Build a Website on Google Cloud
676
-
677
- Google
678
-
679
- Issued Aug 2021
680
-
681
- See credential
682
-
683
- - Build and Secure Networks in Google Cloud
684
-
685
- Google
686
-
687
- Issued Aug 2021
688
-
689
- See credential
690
-
691
- - Create ML Models with BigQuery ML
692
-
693
- Google
694
-
695
- Issued Aug 2021
696
-
697
- See credential
698
-
699
- - Create and Manage Cloud Resources
700
-
701
- Google
702
-
703
- Issued Aug 2021
704
-
705
- See credential
706
-
707
- - Deploy to Kubernetes in Google Cloud
708
-
709
- Google
710
-
711
- Issued Aug 2021
712
-
713
- See credential
714
-
715
- - Implement DevOps in Google Cloud
716
-
717
- Google
718
-
719
- Issued Aug 2021
720
-
721
- See credential
722
-
723
- - Insights from Data with BigQuery
724
-
725
- Google
726
-
727
- Issued Aug 2021
728
-
729
- See credential
730
-
731
- - Integrate with Machine Learning APIs
732
-
733
- Google
734
-
735
- Issued Aug 2021
736
-
737
- See credential
738
-
739
- - Perform Foundational Infrastructure Tasks in Google Cloud
740
-
741
- Google
742
-
743
- Issued Aug 2021
744
-
745
- See credential
746
-
747
- - Apache Spark Associate Developer
748
-
749
- Databricks
750
-
751
- Issued Jun 2021
752
-
753
- Credential ID fff03919-bbc9-304e-99ad-6f2ed47455ed
754
-
755
- See credential
756
-
757
- - Scalable Machine Learning with Apache Spark
758
-
759
- Databricks
760
-
761
- Issued May 2021
762
-
763
- Credential ID 0f4adf96-0412-32f2-8232-fa50c51c9b47
764
-
765
- See credential
766
-
767
- - Apache Spark Programming with Databricks
768
-
769
- Databricks
770
-
771
- Issued May 2021
772
-
773
- Credential ID 518a1d63-8894-3ab5-aaa5-50a9f169436c
774
-
775
- See credential
776
-
777
- - Data Science Professional
778
-
779
- Databricks
780
-
781
- Issued May 2021
782
-
783
- Credential ID f05164e1-5a78-37f8-9c69-3e996fdbb21f
784
-
785
- See credential
786
-
787
- - Delta Lake Fundamentals Accreditation
788
-
789
- Databricks
790
-
791
- Issued May 2021
792
-
793
- Credential ID 0d042e3f-50d3-3821-b064-f3c12ca6c17f
794
-
795
- See credential
796
-
797
- - Deploying a Machine Learning Project with MLflow Projects
798
-
799
- Databricks
800
-
801
- Issued May 2021
802
-
803
- Credential ID 2afa0c7f-48f4-35af-b366-f7c77d2cd20a
804
-
805
- See credential
806
-
807
- - Tracking Experiments with MLflow
808
-
809
- Databricks
810
-
811
- Issued May 2021
812
-
813
- Credential ID 0cbf87b7-e096-3792-a3b7-62d86aa6380d
814
-
815
- See credential
816
-
817
- - Unified Data Analytics Accreditation
818
-
819
- Databricks
820
-
821
- Issued May 2021
822
-
823
- Credential ID afba5402-b5e4-3f9e-95f2-51d6bbb5fa64
824
-
825
- See credential
826
-
827
- - ML Pipelines on Google Cloud
828
-
829
- Google
830
-
831
- Issued Mar 2021
832
-
833
- Credential ID FN5PYWX5PRCP
834
-
835
- See credential
836
-
837
- - Introduction to Trading, Machine Learning & GCP
838
-
839
- Google
840
-
841
- Issued Nov 2020
842
-
843
- Credential ID YV9H5PF4YPLZ
844
-
845
- See credential
846
-
847
- - MLOps (Machine Learning Operations) Fundamentals
848
-
849
- Google
850
-
851
- Issued Nov 2020
852
-
853
- Credential ID 4BDA24UL7K9Z
854
-
855
- See credential
856
-
857
- - Machine Learning for Trading Specialization
858
-
859
- Google
860
-
861
- Issued Nov 2020
862
-
863
- Credential ID YSNPABSMV6JL
864
-
865
- See credential
866
-
867
- - Reinforcement Learning for Trading Strategies
868
-
869
- Google
870
-
871
- Issued Nov 2020
872
-
873
- Credential ID VHKJLFPLLDLU
874
-
875
- See credential
876
-
877
- - Using Machine Learning in Trading and Finance
878
-
879
- Google
880
-
881
- Issued Nov 2020
882
-
883
- Credential ID X5YYLBMPY4BU
884
-
885
- See credential
886
-
887
- - DeepLearning.AI TensorFlow Developer Specialization
888
-
889
- DeepLearning.AI
890
-
891
- Issued Oct 2020
892
-
893
- Credential ID LQ4GHWJ6URBS
894
-
895
- See credential
896
-
897
- - Perform Foundational Data, ML, and AI Tasks in Google Cloud
898
-
899
- Google
900
-
901
- Issued Oct 2020
902
-
903
- See credential
904
-
905
- - Professional Machine Learning Engineer
906
-
907
- Google
908
-
909
- Issued Oct 2020
910
-
911
- Credential ID 24896478
912
-
913
- See credential
914
-
915
- - Sequences, Time Series and Prediction
916
-
917
- Google
918
-
919
- Issued Oct 2020
920
-
921
- Credential ID WHBV68C4WJT5
922
-
923
- See credential
924
-
925
- - Convolutional Neural Networks in TensorFlow
926
-
927
- Google
928
-
929
- Issued Sep 2020
930
-
931
- Credential ID 78HJEJZ3T2BB
932
-
933
- See credential
934
-
935
- - Introduction to TensorFlow for Artificial Intelligence, Machine Learning, and Deep Learning
936
-
937
- Google
938
-
939
- Issued Sep 2020
940
-
941
- Credential ID SW885ZMDHTYM
942
-
943
- See credential
944
-
945
- - Natural Language Processing in TensorFlow
946
-
947
- Google
948
-
949
- Issued Sep 2020
950
-
951
- Credential ID JZ9TBHXJFLWM
952
-
953
- See credential
954
-
955
- - Advanced Machine Learning with TensorFlow on Google Cloud Platform Specialization
956
-
957
- Google
958
-
959
- Issued Jul 2020
960
-
961
- Credential ID V492QQ4JJKEB
962
-
963
- See credential
964
-
965
- - End-to-End Machine Learning with TensorFlow on GCP
966
-
967
- Google
968
-
969
- Issued Jul 2020
970
-
971
- Credential ID QLDMNADDBSRR
972
-
973
- See credential
974
-
975
- - Image Understanding with TensorFlow on GCP
976
-
977
- Google
978
-
979
- Issued Jul 2020
980
-
981
- Credential ID HY4HSSY8JSPN
982
-
983
- See credential
984
-
985
- - Production Machine Learning Systems
986
-
987
- Google
988
-
989
- Issued Jul 2020
990
-
991
- Credential ID THZZNW22LHKT
992
-
993
- See credential
994
-
995
- - Recommendation Systems with TensorFlow on GCP
996
-
997
- Google
998
-
999
- Issued Jul 2020
1000
-
1001
- Credential ID 2D4LT28697TC
1002
-
1003
- See credential
1004
-
1005
- - Sequence Models for Time Series and Natural Language Processing
1006
-
1007
- Google
1008
-
1009
- Issued Jul 2020
1010
-
1011
- Credential ID 6XUV7YJFM3ZA
1012
-
1013
- See credential
1014
-
1015
- - Building Batch Data Pipelines on GCP
1016
-
1017
- Google
1018
-
1019
- Issued May 2020
1020
-
1021
- Credential ID 5QYSK9E5EAFN
1022
-
1023
- See credential
1024
-
1025
- - Building Resilient Streaming Analytics Systems on GCP
1026
-
1027
- Google
1028
-
1029
- Issued May 2020
1030
-
1031
- Credential ID FYQW7D4F6PD4
1032
-
1033
- See credential
1034
-
1035
- - Data Engineering with Google Cloud Specialization
1036
-
1037
- Google
1038
-
1039
- Issued May 2020
1040
-
1041
- Credential ID EPZ3WQFC423E
1042
-
1043
- See credential
1044
-
1045
- - Modernizing Data Lakes and Data Warehouses with GCP
1046
-
1047
- Google
1048
-
1049
- Issued May 2020
1050
-
1051
- Credential ID 393P3HLZWY8H
1052
-
1053
- See credential
1054
-
1055
- - Smart Analytics, Machine Learning, and AI on GCP
1056
-
1057
- Google
1058
-
1059
- Issued May 2020
1060
-
1061
- Credential ID AK77VUVN4ARJ
1062
-
1063
- See credential
1064
-
1065
- - Google Cloud Platform Big Data and Machine Learning Fundamentals
1066
-
1067
- Google
1068
-
1069
- Issued Apr 2020
1070
-
1071
- Credential ID 2Q35NYHYMW5E
1072
-
1073
- See credential
1074
-
1075
- - Devenez Mentor Evaluateur
1076
-
1077
- OpenClassrooms
1078
-
1079
- Issued Feb 2019
1080
-
1081
- Credential ID 8151214336
1082
-
1083
- See credential
1084
-
1085
- - Advanced AI: Deep Reinforcement Learning in Python
1086
-
1087
- Udemy
1088
-
1089
- Issued Aug 2018
1090
-
1091
- Credential ID UC-5FM0CC9S
1092
-
1093
- See credential
1094
-
1095
- - Artificial Intelligence: Reinforcement Learning in Python
1096
-
1097
- Udemy
1098
-
1099
- Issued Jul 2018
1100
-
1101
- Credential ID UC-XALJEH7G
1102
-
1103
- See credential
1104
-
1105
- - Concevez un site avec Flask
1106
-
1107
- OpenClassrooms
1108
-
1109
- Issued Jul 2018
1110
-
1111
- Credential ID 5343531703
1112
-
1113
- See credential
1114
-
1115
- - Les étapes de la vie du Mentor
1116
-
1117
- OpenClassrooms
1118
-
1119
- Issued Jul 2018
1120
-
1121
- Credential ID 8431716200
1122
-
1123
- See credential
1124
-
1125
- - Devenez Mentor chez OpenClassrooms
1126
-
1127
- OpenClassrooms
1128
-
1129
- Issued May 2018
1130
-
1131
- Credential ID 6193593386
1132
-
1133
- See credential
1134
-
1135
- - Complete Guide to ElasticSearch
1136
-
1137
- Udemy
1138
-
1139
- Issued Mar 2018
1140
-
1141
- Credential ID UC-H5AJQVA3
1142
-
1143
- See credential
1144
-
1145
- - Introduction to Hadoop
1146
-
1147
- The Linux Foundation
1148
-
1149
- Issued Oct 2017
1150
-
1151
- Credential ID ad676a8fe7994edea33516b80b540971
1152
-
1153
- See credential
1154
-
1155
- - Artificial Intelligence Nanodegree
1156
-
1157
- Udacity
1158
-
1159
- Issued Sep 2017
1160
-
1161
- Credential ID PV7A7EAA
1162
-
1163
- See credential
1164
-
1165
- - High Performance Computing
1166
-
1167
- University of Luxembourg
1168
-
1169
- Issued Feb 2017
1170
-
1171
- See credential
1172
-
1173
- - Machine Learning
1174
-
1175
- Standford University
1176
-
1177
- Issued Sep 2015
1178
-
1179
- Credential ID Grade: 97%
1180
-
1181
- See credential
1182
-
1183
- - TOEIC
1184
-
1185
- Listening, Reading
1186
-
1187
- Issued Jan 2014
1188
-
1189
- Credential ID Score: 975/990
1190
-
1191
- Publications
1192
-
1193
- - Is AI/ML Monitoring just Data Engineering? 🤔
1194
-
1195
- MLOps Community July 24, 2023
1196
-
1197
- While the future of machine learning and MLOps is being debated,
1198
- practitioners still need to attend to their machine learning models
1199
- in production. This is no easy task, as ML engineers must constantly
1200
- assess the quality of the data that enters and exits their
1201
- pipelines, and ensure that their models generate the correct
1202
- predictions. To assist ML engineers with this challenge, several
1203
- AI/ML monitoring solutions have been developed.
1204
- In this article, I will discuss the nature of AI/ML… Show more
1205
-
1206
- While the future of machine learning and MLOps is being debated,
1207
- practitioners still need to attend to their machine learning models
1208
- in production. This is no easy task, as ML engineers must constantly
1209
- assess the quality of the data that enters and exits their
1210
- pipelines, and ensure that their models generate the correct
1211
- predictions. To assist ML engineers with this challenge, several
1212
- AI/ML monitoring solutions have been developed.
1213
- In this article, I will discuss the nature of AI/ML monitoring and
1214
- how it relates to data engineering. First, I will present the
1215
- similarities between AI/ML monitoring and data engineering. Second,
1216
- I will enumerate additional features that AI/ML monitoring solutions
1217
- can provide. Third, I will briefly touch on the topic of AI/ML
1218
- observability and its relation to AI/ML monitoring. Finally, I will
1219
- provide my conclusion about the field of AI/ML monitoring and how it
1220
- should be considered to ensure the success of your AI/ML project.
1221
- Show less
1222
-
1223
- See publication
1224
-
1225
- - A great MLOps project should start with a good Python Package 🐍
1226
-
1227
- MLOps Community June 28, 2023
1228
-
1229
- In this article, I present the implementation of a Python package on
1230
- GitHub designed to support MLOps initiatives. The goal of this
1231
- package is to make the coding workflow of data scientists and ML
1232
- engineers as flexible, robust, and productive as possible. First, I
1233
- start by motivating the use of Python packages. Then, I provide some
1234
- tools and tips you can include in your MLOps project. Finally, I
1235
- explain the follow-up steps required to take this package to the
1236
- next level and make it work in your… Show more
1237
-
1238
- In this article, I present the implementation of a Python package on
1239
- GitHub designed to support MLOps initiatives. The goal of this
1240
- package is to make the coding workflow of data scientists and ML
1241
- engineers as flexible, robust, and productive as possible. First, I
1242
- start by motivating the use of Python packages. Then, I provide some
1243
- tools and tips you can include in your MLOps project. Finally, I
1244
- explain the follow-up steps required to take this package to the
1245
- next level and make it work in your environment. Show less
1246
-
1247
- See publication
1248
-
1249
- - Fixing the MLOps Survey on LLMs with ChatGPT API: Lessons Learned
1250
-
1251
- MLOps Community May 11, 2023
1252
-
1253
- Large Language Model (LLM) is such an existing topic. Since the
1254
- release of ChatGPT, we saw a surge of innovation ranging from
1255
- education mentorship to finance advisory. Each week is a new
1256
- opportunity for addressing new kinds of problems, increasing human
1257
- productivity, or improving existing solutions. Yet, we may wonder if
1258
- this is just a new hype cycle or if organizations are truly adopting
1259
- LLMs at scale …
1260
- On March 2023, the MLOps Community issued a survey about LLMs in
1261
- production to… Show more
1262
-
1263
- Large Language Model (LLM) is such an existing topic. Since the
1264
- release of ChatGPT, we saw a surge of innovation ranging from
1265
- education mentorship to finance advisory. Each week is a new
1266
- opportunity for addressing new kinds of problems, increasing human
1267
- productivity, or improving existing solutions. Yet, we may wonder if
1268
- this is just a new hype cycle or if organizations are truly adopting
1269
- LLMs at scale …
1270
- On March 2023, the MLOps Community issued a survey about LLMs in
1271
- production to picture the state of adoption. The survey is full of
1272
- interesting insights, but there is a catch: 80% of the questions are
1273
- open-ended, which means respondents answered the survey freely from
1274
- a few keywords to full sentences. I volunteered to clean up the
1275
- answers with the help of ChatGPT and let the community get a grasp
1276
- of the survey experiences.
1277
- In this article, I present the steps and lessons learned from my
1278
- journey to shed some light on the MLOps survey on LLMs. I’m first
1279
- going to present the goal and questions of the survey. Then, I will
1280
- explain how I used ChatGPT to review the data and standardize the
1281
- content. Finally, I’m going to evaluate the performance of ChatGPT
1282
- compared to a manual review. Show less
1283
-
1284
- See publication
1285
-
1286
- - Kubeflow: The Machine Learning Toolkit for Kubernetes
1287
-
1288
- MLOps Community in Luxembourg April 26, 2023
1289
-
1290
- See publication
1291
-
1292
- - MLflow: An open source platform for the machine learning lifecycle
1293
-
1294
- MLOps Community in Luxembourg April 26, 2023
1295
-
1296
- See publication
1297
-
1298
- - We need POSIX for MLOps
1299
-
1300
- MLOps Community April 21, 2023
1301
-
1302
- If you work on MLOps, you must navigate an ever-growing landscape of
1303
- tools and solutions. This is both an intense source of stimulation
1304
- and fatigue for MLOps practitioners.
1305
- Vendors and users face the same problem: How can we combine all
1306
- these tools without the combinatorial complexity of creating custom
1307
- integrations?
1308
- In this article, I propose a solution analogous to POSIX to address
1309
- this challenge. First, I motivate the creation of common protocols
1310
- and schemas for combining MLOps… Show more
1311
-
1312
- If you work on MLOps, you must navigate an ever-growing landscape of
1313
- tools and solutions. This is both an intense source of stimulation
1314
- and fatigue for MLOps practitioners.
1315
- Vendors and users face the same problem: How can we combine all
1316
- these tools without the combinatorial complexity of creating custom
1317
- integrations?
1318
- In this article, I propose a solution analogous to POSIX to address
1319
- this challenge. First, I motivate the creation of common protocols
1320
- and schemas for combining MLOps tools. Second, I present a
1321
- high-level architecture to support implementation. Third, I conclude
1322
- with the benefits and limitations of standardizing MLOps. Show less
1323
-
1324
- See publication
1325
-
1326
- - How to install Kubeflow Pipelines v2 on Apple Silicon
1327
-
1328
- Medium September 24, 2022
1329
-
1330
- Kubeflow Pipelines (KFP) is a powerful platform for building machine
1331
- learning pipelines at scale with Kubernetes. The platform is well
1332
- supported on major cloud platforms such as GCP (Vertex AI Pipelines)
1333
- or AWS (Kubeflow on AWS). However, installing KFP on Apple Silicon
1334
- (macOS 12.5.1 with Apple M1 Pro) proved to be more challenging than
1335
- I imagined. Thus, I wanted to share my experience and tips to
1336
- install KFP as easily as possible on your shiny Mac.
1337
- In this article, I present 4 steps to… Show more
1338
-
1339
- Kubeflow Pipelines (KFP) is a powerful platform for building machine
1340
- learning pipelines at scale with Kubernetes. The platform is well
1341
- supported on major cloud platforms such as GCP (Vertex AI Pipelines)
1342
- or AWS (Kubeflow on AWS). However, installing KFP on Apple Silicon
1343
- (macOS 12.5.1 with Apple M1 Pro) proved to be more challenging than
1344
- I imagined. Thus, I wanted to share my experience and tips to
1345
- install KFP as easily as possible on your shiny Mac.
1346
- In this article, I present 4 steps to install Kubeflow on Apple
1347
- Silicon, using Rancher Desktop for setting up Docker/Kubernetes. In
1348
- the end, I list the problems I encountered during the installation
1349
- of Kubeflow Pipelines. Show less
1350
-
1351
- See publication
1352
-
1353
- - The Programming Trade-Off: Purpose, Productivity, Performance
1354
-
1355
- Medium August 15, 2019
1356
-
1357
- As programmers, we are continuously looking for languages that are
1358
- performant, productive, and general purpose. Is there any
1359
- programming language that currently satisfies these properties? Can
1360
- we ever create one?
1361
- In this article, I present a fundamental trade-off that affects the
1362
- design of programming languages and the success of software
1363
- projects.
1364
-
1365
- See publication
1366
-
1367
- - Creating better ground truth to further understand Android malware: A large scale mining approach based on antivirus labels and malicious artifacts
1368
-
1369
- University of Luxembourg July 1, 2019
1370
-
1371
- Mobile applications are essential for interacting with technology
1372
- and other people. With more than 2 billion devices deployed all over
1373
- the world, Android offers a thriving ecosystem by making accessible
1374
- the work of thousands of developers on digital marketplaces such as
1375
- Google Play. Nevertheless, the success of Android also exposes
1376
- millions of users to malware authors who seek to siphon private
1377
- information and hijack mobile devices for their benefits.
1378
- To fight against the proliferation… Show more
1379
-
1380
- Mobile applications are essential for interacting with technology
1381
- and other people. With more than 2 billion devices deployed all over
1382
- the world, Android offers a thriving ecosystem by making accessible
1383
- the work of thousands of developers on digital marketplaces such as
1384
- Google Play. Nevertheless, the success of Android also exposes
1385
- millions of users to malware authors who seek to siphon private
1386
- information and hijack mobile devices for their benefits.
1387
- To fight against the proliferation of Android malware, the security
1388
- community embraced machine learning, a branch of artificial
1389
- intelligence that powers a new generation of detection systems.
1390
- Machine learning algorithms, however, require a substantial number
1391
- of qualified samples to learn the classification rules enforced by
1392
- security experts. Unfortunately, malware ground truths are
1393
- notoriously hard to construct due to the inherent complexity of
1394
- Android applications and the global lack of public information about
1395
- malware. In a context where both information and human resources are
1396
- limited, the security community is in demand for new approaches to
1397
- aid practitioners to accurately define Android malware, automate
1398
- classification decisions, and improve the comprehension of Android
1399
- malware.
1400
- This dissertation proposes three solutions to assist with the
1401
- creation of malware ground truths. Show less
1402
-
1403
- See publication
1404
-
1405
- - Euphony: Harmonious Unification of Cacophonous Anti-Virus Vendor Labels for Android Malware
1406
-
1407
- MSR 2017 May 21, 2017
1408
-
1409
- Android malware is now pervasive and evolving rapidly. Thousands of
1410
- malware samples are discovered every day with new models of attacks.
1411
- The growth of these threats has come hand in hand with the
1412
- proliferation of collective repositories sharing the latest
1413
- specimens. Having access to a large number of samples opens new
1414
- research directions aiming at efficiently vetting apps. However,
1415
- automatically inferring a reference ground-truth from those
1416
- repositories is not straightforward and can… Show more
1417
-
1418
- Android malware is now pervasive and evolving rapidly. Thousands of
1419
- malware samples are discovered every day with new models of attacks.
1420
- The growth of these threats has come hand in hand with the
1421
- proliferation of collective repositories sharing the latest
1422
- specimens. Having access to a large number of samples opens new
1423
- research directions aiming at efficiently vetting apps. However,
1424
- automatically inferring a reference ground-truth from those
1425
- repositories is not straightforward and can inadvertently lead to
1426
- unforeseen misconceptions. On the one hand, samples are often
1427
- mislabeled as different parties use distinct naming schemes for the
1428
- same sample. On the other hand, samples are frequently misclassified
1429
- due to conceptual errors made during labeling processes.
1430
- In this paper, we analyze the associations between all labels given
1431
- by different vendors and we propose a system called EUPHONY to
1432
- systematically unify common samples into family groups. The key
1433
- novelty of our approach is that no prior knowledge of malware
1434
- families is needed. We evaluate our approach using reference
1435
- datasets and more than 0.4 million additional samples outside of
1436
- these datasets. Results show that EUPHONY provides competitive
1437
- performance against the state-of-the-art. Show less
1438
-
1439
- See publication
1440
-
1441
- - On the Lack of Consensus in Anti-Virus Decisions: Metrics and Insights on Building Ground Truths of Android Malware
1442
-
1443
- DIMVA 2016 July 7, 2016
1444
-
1445
- There is generally a lack of consensus in Antivirus (AV) engines'
1446
- decisions on a given sample. This challenges the building of
1447
- authoritative ground-truth datasets. Instead, researchers and
1448
- practitioners may rely on unvalidated approaches to build their
1449
- ground truth, e.g., by considering decisions from a selected set of
1450
- Antivirus vendors or by setting up a threshold number of positive
1451
- detections before classifying a sample. Both approaches are biased
1452
- as they implicitly either decide on ranking… Show more
1453
-
1454
- There is generally a lack of consensus in Antivirus (AV) engines'
1455
- decisions on a given sample. This challenges the building of
1456
- authoritative ground-truth datasets. Instead, researchers and
1457
- practitioners may rely on unvalidated approaches to build their
1458
- ground truth, e.g., by considering decisions from a selected set of
1459
- Antivirus vendors or by setting up a threshold number of positive
1460
- detections before classifying a sample. Both approaches are biased
1461
- as they implicitly either decide on ranking AV products, or they
1462
- consider that all AV decisions have equal weights. In this paper, we
1463
- extensively investigate the lack of agreement among AV engines.
1464
- To that end, we propose a set of metrics that quantitatively
1465
- describe the different dimensions of this lack of consensus. We show
1466
- how our metrics can bring important insights by using the detection
1467
- results of 66 AV products on 2 million Android apps as a case study.
1468
- Our analysis focuses not only on AV binary decision but also on the
1469
- notoriously hard problem of labels that AVs associate with
1470
- suspicious files, and allows to highlight biases hidden in the
1471
- collection of a malware ground truth---a foundation stone of any
1472
- machine learning-based malware detection approach. Show less
1473
-
1474
- See publication
1475
-
1476
- Courses
1477
-
1478
- - Artificial Intelligence
1479
-
1480
- https://www.edx.org
1481
-
1482
- - Data Science at Scale
1483
-
1484
- https://www.coursera.org/
1485
-
1486
- - Descriptive Statistics
1487
-
1488
- https://www.edx.org/
1489
-
1490
- - Developing Android Apps
1491
-
1492
- https://eu.udacity.com/
1493
-
1494
- - Full Stack Foundations
1495
-
1496
- https://www.udacity.com/
1497
-
1498
- - Functional Programming
1499
-
1500
- https://www.edx.org/
1501
-
1502
- - Introduction to Logic
1503
-
1504
- https://www.coursera.org/
1505
-
1506
- - Knowledge-Based AI: Cognitive Systems
1507
-
1508
- https://eu.udacity.com/
1509
-
1510
- - Machine Learning
1511
-
1512
- https://www.coursera.org/
1513
-
1514
- - Mathematics for Computer Science
1515
-
1516
- https://ocw.mit.edu/
1517
-
1518
- - Nanodegree Program: Artificial Intelligence
1519
-
1520
- https://eu.udacity.com/
1521
-
1522
- - Paradigms of Computer Programming
1523
-
1524
- https://www.edx.org
1525
-
1526
- - Statistics Inference
1527
-
1528
- https://www.edx.org/
1529
-
1530
- - Statistics Probability
1531
-
1532
- https://www.edx.org/
1533
-
1534
- - ChatGPT Prompt Engineering for Developers
1535
-
1536
- Deeplearning.ai
1537
-
1538
- - Introduction to Data-Centric AI
1539
-
1540
- -
1541
-
1542
- - LangChain for LLM Application Development - DeepLearning.ai
1543
-
1544
- -
1545
-
1546
- - LangChain: Chat with Your Data - DeepLearning.ai
1547
-
1548
- -
1549
-
1550
- - Hugging Face Course
1551
-
1552
- huggingface.co/course/
1553
-
1554
- Projects
1555
-
1556
- - MLOps Python Package
1557
-
1558
- Jun 2023 - Jun 2023
1559
-
1560
- Kickstart your MLOps initiative with a flexible, robust, and
1561
- productive Python package.
1562
- https://github.com/fmind/mlops-python-package
1563
-
1564
- - Fixing the MLOps Survey with ChatGPT
1565
-
1566
- May 2023 - May 2023
1567
-
1568
- Fixing the MLOps Survey on LLMs with ChatGPT API.
1569
- https://fmind.medium.com/fixing-the-mlops-survey-on-llms-with-chatgpt-api-lessons-learned-62d90e721331
1570
-
1571
- See project
1572
-
1573
- - Kubeflow Demo
1574
-
1575
- Apr 2023 - Apr 2023
1576
-
1577
- Kubeflow demo for the MLOps Community Meetup in Luxembourg.
1578
-
1579
- See project
1580
-
1581
- - MLflow Demo
1582
-
1583
- Apr 2023 - Apr 2023
1584
-
1585
- MLflow demo for the MLOps Community Meetup in Luxembourg.
1586
-
1587
- See project
1588
-
1589
- - onet
1590
-
1591
- Aug 2020 - Sep 2020
1592
-
1593
- Train and predict procedures of DNN for binary image classification
1594
-
1595
- See project
1596
-
1597
- - fincrawl
1598
-
1599
- Nov 2019 - Dec 2019
1600
-
1601
- Crawl documents, metadata, and files from financial institutions
1602
-
1603
- See project
1604
-
1605
- - invest
1606
-
1607
- Aug 2019 - Sep 2019
1608
-
1609
- Stock market analysis focused on dividends
1610
-
1611
- See project
1612
-
1613
- - parsoc
1614
-
1615
- Jul 2019 - Sep 2019
1616
-
1617
- Convert docx files to json
1618
-
1619
- See project
1620
-
1621
- - Bigdata Tutorials
1622
-
1623
- Sep 2015 - Jul 2019
1624
-
1625
- Tutorials for the Big Data course @ uni.lu
1626
-
1627
- See project
1628
-
1629
- - STASE: A set of statistical metrics to better understand and qualify malware datasets
1630
-
1631
- Apr 2016 - Jul 2019
1632
-
1633
- A handful of statistical metrics to better understand and qualify
1634
- malware datasets
1635
-
1636
- See project
1637
-
1638
- - apkworkers
1639
-
1640
- Sep 2015 - Jul 2019
1641
-
1642
- A celery application to distribute Android malware analysis
1643
-
1644
- See project
1645
-
1646
- - servalx
1647
-
1648
- Sep 2015 - Jul 2019
1649
-
1650
- A set of tools and modules to process Android malware with Androzoo
1651
-
1652
- See project
1653
-
1654
- - Euphony: Harmonious Unification of Cacophonous Anti-Virus Vendor Labels for Android Malware
1655
-
1656
- Mar 2017 - Mar 2019
1657
-
1658
- Harmonious Unification of Cacophonous Anti-Virus Vendor Labels for
1659
- Android Malware
1660
-
1661
- See project
1662
-
1663
- - Automatic Speech Recognition with Tensorflow
1664
-
1665
- Sep 2017 - Sep 2017
1666
-
1667
- An automatic speech-recognition system based on Tensorflow
1668
-
1669
- See project
1670
-
1671
- - Dog Recognition with Tensorflow
1672
-
1673
- Aug 2017 - Aug 2017
1674
-
1675
- A machine-learning model train to recognize dogs, even from human
1676
- faces
1677
-
1678
- See project
1679
-
1680
- - genius
1681
-
1682
- Jun 2017 - Jul 2017
1683
-
1684
- An implementation of LISP Scheme based on Haskell
1685
-
1686
- See project
1687
-
1688
- - Alexa History Skill
1689
-
1690
- Jun 2017 - Jun 2017
1691
-
1692
- A Alexa skill that provides year-dated facts on demand
1693
-
1694
- See project
1695
-
1696
- - Air Cargo Planning System
1697
-
1698
- Feb 2017 - Apr 2017
1699
-
1700
- An automated Air Cargo transport system based on AI planning
1701
-
1702
- See project
1703
-
1704
- - Sign Language Recognition System
1705
-
1706
- Feb 2017 - Apr 2017
1707
-
1708
- A sign recognition system based on Hidden Markov Model
1709
-
1710
- See project
1711
-
1712
- - AI Agent for the Isolation Game
1713
-
1714
- Mar 2017 - Mar 2017
1715
-
1716
- An AI game agent to play the Isolation game
1717
-
1718
- See project
1719
-
1720
- - Sudoku Solver
1721
-
1722
- Jan 2017 - Feb 2017
1723
-
1724
- A Diagonal Sudoku solver implemented with Python
1725
-
1726
- See project
1727
-
1728
- - lkml
1729
-
1730
- Nov 2016 - Jan 2017
1731
-
1732
- Gather emails from https://lkml.org/
1733
-
1734
- See project
1735
-
1736
- - Master 2 School Projects
1737
-
1738
- Sep 2013 - Jun 2014
1739
-
1740
- School projects from 2013 to 2014 - Master 2 Sécurité des Systèmes
1741
- d'Information (Metz)
1742
-
1743
- See project
1744
-
1745
- - chattail
1746
-
1747
- Dec 2013 - Mar 2014
1748
-
1749
- Send log streams over XMPP to monitor your systems
1750
-
1751
- See project
1752
-
1753
- - Master 1 School Projects
1754
-
1755
- Jun 2012 - Sep 2013
1756
-
1757
- See project
1758
-
1759
- - Bachelor School Projects
1760
-
1761
- Jun 2011 - Sep 2012
1762
-
1763
- See project
1764
-
1765
- - Professional Bachelor School Project
1766
-
1767
- Sep 2009 - Jun 2010
1768
-
1769
- See project
1770
-
1771
- - https://github.com/fmind/mlops-python-package
1772
-
1773
- -
1774
-
1775
- Kickstart your MLOps initiative with a flexible, robust, and
1776
- productive Python package.
1777
-
1778
- Languages
1779
-
1780
- - Français
1781
-
1782
- Native or bilingual proficiency
1783
-
1784
- - Anglais
1785
-
1786
- Full professional proficiency
1787
-
1788
- View Médéric’s full profile
1789
-
1790
- -
1791
-
1792
- See who you know in common
1793
-
1794
- -
1795
-
1796
- Get introduced
1797
-
1798
- -
1799
-
1800
- Contact Médéric directly
1801
-
1802
- Sign in to view full profile
1803
-
1804
- Sign in to view Médéric’s full profile
1805
-
1806
- Sign in
1807
-
1808
- Welcome back
1809
-
1810
- Email or phone
1811
-
1812
- Password
1813
-
1814
- Show
1815
-
1816
- Forgot password?
1817
-
1818
- Sign in
1819
-
1820
- or
1821
-
1822
- By clicking Continue, you agree to LinkedIn’s User Agreement, Privacy
1823
- Policy, and Cookie Policy.
1824
-
1825
- New to LinkedIn? Join now
1826
-
1827
- or
1828
-
1829
- By clicking Continue, you agree to LinkedIn’s User Agreement, Privacy
1830
- Policy, and Cookie Policy.
1831
-
1832
- New to LinkedIn? Join now
1833
-
1834
- Explore collaborative articles
1835
-
1836
- We’re unlocking community knowledge in a new way. Experts add insights
1837
- directly into each article, started with the help of AI.
1838
-
1839
- Explore More
1840
-
1841
- Médéric’s public profile badge
1842
-
1843
- Include this LinkedIn profile on other websites
1844
-
1845
- Médéric HURIER
1846
-
1847
- Freelancer: AI/ML/MLOps Engineer | Data Scientist | MLOps Community
1848
- Organizer | OpenClassrooms Mentor | Hacker | PhD
1849
-
1850
- - Lead MLOps Engineer at Decathlon Technology
1851
-
1852
- - University of Luxembourg
1853
-
1854
- View profile
1855
-
1856
- View profile badges
1857
-
1858
- - LinkedIn © 2023
1859
-
1860
- - About
1861
-
1862
- - Accessibility
1863
-
1864
- - User Agreement
1865
-
1866
- - Privacy Policy
1867
-
1868
- - Cookie Policy
1869
-
1870
- - Copyright Policy
1871
-
1872
- - Brand Policy
1873
-
1874
- - Guest Controls
1875
-
1876
- - Community Guidelines
1877
-
1878
- - - العربية (Arabic)
1879
- - Čeština (Czech)
1880
- - Dansk (Danish)
1881
- - Deutsch (German)
1882
- - English (English)
1883
- - Español (Spanish)
1884
- - Français (French)
1885
- - हिंदी (Hindi)
1886
- - Bahasa Indonesia (Indonesian)
1887
- - Italiano (Italian)
1888
- - 日本語 (Japanese)
1889
- - 한국어 (Korean)
1890
- - Bahasa Malaysia (Malay)
1891
- - Nederlands (Dutch)
1892
- - Norsk (Norwegian)
1893
- - Polski (Polish)
1894
- - Português (Portuguese)
1895
- - Română (Romanian)
1896
- - Русский (Russian)
1897
- - Svenska (Swedish)
1898
- - ภาษาไทย (Thai)
1899
- - Tagalog (Tagalog)
1900
- - Türkçe (Turkish)
1901
- - Українська (Ukrainian)
1902
- - 简体中文 (Chinese (Simplified))
1903
- - 正體中文 (Chinese (Traditional))
1904
-
1905
- Language
1906
-
1907
- Sign in to view Médéric’s full profile
1908
-
1909
- Sign in
1910
-
1911
- Welcome back
1912
-
1913
- Email or phone
1914
-
1915
- Password
1916
-
1917
- Show
1918
-
1919
- Forgot password?
1920
-
1921
- Sign in
1922
-
1923
- or
1924
-
1925
- By clicking Continue, you agree to LinkedIn’s User Agreement, Privacy
1926
- Policy, and Cookie Policy.
1927
-
1928
- New to LinkedIn? Join now
1929
-
1930
- or
1931
-
1932
- By clicking Continue, you agree to LinkedIn’s User Agreement, Privacy
1933
- Policy, and Cookie Policy.
1934
-
1935
- New to LinkedIn? Join now
1936
-
1937
- []
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
invoke.yaml CHANGED
@@ -1,24 +1,2 @@
1
- # https://docs.pyinvoke.org/en/latest/index.html
2
-
3
  run:
4
- echo: true
5
- app:
6
- path: "app.py"
7
- database:
8
- collection: "resume"
9
- path: "database"
10
- linkedin:
11
- html: "files/linkedin.html"
12
- markdown: "files/linkedin.md"
13
- text: "files/linkedin.txt"
14
- mypy:
15
- cache: ".mypy_cache/"
16
- pip:
17
- requirements: "requirements.txt"
18
- requirements_dev: "requirements-dev.txt"
19
- python:
20
- files: "tasks/ *.py"
21
- path: "python3"
22
- venv:
23
- path: ".venv/"
24
- python: ".venv/bin/python"
 
 
 
1
  run:
2
+ echo: true
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
lib.py DELETED
@@ -1,72 +0,0 @@
1
- """Library of the project."""
2
- # pylint: disable=wrong-import-position
3
-
4
- # %% IMPORTS
5
-
6
- __import__("pysqlite3")
7
-
8
- import functools
9
- import os
10
- import sys
11
-
12
- # https://docs.trychroma.com/troubleshooting#sqlite
13
- sys.modules["sqlite3"] = sys.modules.pop("pysqlite3")
14
-
15
- import chromadb
16
- import openai
17
- import tiktoken
18
- from chromadb.utils import embedding_functions
19
-
20
- # %% CONFIGS
21
-
22
- DATABASE_COLLECTION = "resume"
23
- DATABASE_PATH = "database"
24
-
25
- EMBEDDING_MODEL = "text-embedding-ada-002"
26
-
27
- ENCODING_NAME = "cl100k_base"
28
- ENCODING_OUTPUT_LIMIT = 8191
29
-
30
- MODEL_NAME = "gpt-3.5-turbo-16k"
31
- MODEL_INPUT_LIMIT = 16_385
32
- MODEL_TEMPERATURE = 0.9
33
-
34
- OPENAI_API_KEY = os.environ["OPENAI_API_KEY"]
35
-
36
- # %% TYPINGS
37
-
38
- Collection = chromadb.Collection
39
-
40
- # %% FUNCTIONS
41
-
42
-
43
- def get_language_model(
44
- model: str = MODEL_NAME,
45
- api_key: str = OPENAI_API_KEY,
46
- temperature: float = MODEL_TEMPERATURE,
47
- ) -> openai.ChatCompletion:
48
- """Get an OpenAI ChatCompletion model."""
49
- openai.api_key = api_key # configure the API key globally
50
- return functools.partial(
51
- openai.ChatCompletion.create, model=model, temperature=temperature
52
- )
53
-
54
-
55
- def get_database_client(path: str) -> chromadb.API:
56
- """Get a persistent client to the Chroma DB."""
57
- settings = chromadb.Settings(allow_reset=True, anonymized_telemetry=False)
58
- return chromadb.PersistentClient(path=path, settings=settings)
59
-
60
-
61
- def get_encoding_function(encoding_name: str = ENCODING_NAME) -> tiktoken.Encoding:
62
- """Get the encoding function for OpenAI models."""
63
- return tiktoken.get_encoding(encoding_name=encoding_name).encode
64
-
65
-
66
- def get_embedding_function(
67
- model_name: str = EMBEDDING_MODEL, api_key: str = OPENAI_API_KEY
68
- ) -> embedding_functions.EmbeddingFunction:
69
- """Get the embedding function for Chroma DB collections."""
70
- return embedding_functions.OpenAIEmbeddingFunction(
71
- model_name=model_name, api_key=api_key
72
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
pyproject.toml CHANGED
@@ -1,17 +1,9 @@
1
- # https://pip.pypa.io/en/stable/reference/build-system/pyproject-toml/
2
-
3
- # https://black.readthedocs.io/en/stable/usage_and_configuration/the_basics.html
4
- [tool.black]
5
-
6
- # https://pycqa.github.io/isort/docs/configuration/options.html
7
- [tool.isort]
8
- profile = "black"
9
-
10
- # https://mypy.readthedocs.io/en/stable/config_file.html
11
  [tool.mypy]
12
- plugins = ["pydantic.mypy"]
13
  ignore_missing_imports = true
14
 
15
- # https://pylint.pycqa.org/en/latest/user_guide/configuration/index.html
16
- [tool.pylint]
17
- disable = []
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  [tool.mypy]
2
+ python_version = "3.12"
3
  ignore_missing_imports = true
4
 
5
+ [tool.ruff]
6
+ fix = true
7
+ indent-width = 4
8
+ line-length = 100
9
+ target-version = "py312"
requirements-dev.txt CHANGED
@@ -1,8 +1,4 @@
1
- # https://pip.pypa.io/en/stable/reference/requirements-file-format/
2
-
3
- black
4
  invoke
5
  ipykernel
6
- isort
7
  mypy
8
- pylint
 
 
 
 
1
  invoke
2
  ipykernel
 
3
  mypy
4
+ ruff
requirements-main.txt ADDED
@@ -0,0 +1,2 @@
 
 
 
1
+ gradio==4.29.0
2
+ openai==1.28.0
requirements.txt CHANGED
@@ -1,8 +1,232 @@
1
- # https://pip.pypa.io/en/stable/reference/requirements-file-format/
2
-
3
- chromadb==0.4.13
4
- gradio==3.47.1
5
- openai==0.28.1
6
- pysqlite3-binary==0.5.1
7
- tiktoken==0.5.1
8
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # This file was autogenerated by uv via the following command:
2
+ # uv pip compile requirements-main.txt -o requirements.txt
3
+ aiofiles==23.2.1
4
+ # via gradio
5
+ altair==5.3.0
6
+ # via gradio
7
+ annotated-types==0.6.0
8
+ # via pydantic
9
+ anyio==4.3.0
10
+ # via
11
+ # httpx
12
+ # openai
13
+ # starlette
14
+ # watchfiles
15
+ attrs==23.2.0
16
+ # via
17
+ # jsonschema
18
+ # referencing
19
+ certifi==2024.2.2
20
+ # via
21
+ # httpcore
22
+ # httpx
23
+ # requests
24
+ charset-normalizer==3.3.2
25
+ # via requests
26
+ click==8.1.7
27
+ # via
28
+ # typer
29
+ # uvicorn
30
+ contourpy==1.2.1
31
+ # via matplotlib
32
+ cycler==0.12.1
33
+ # via matplotlib
34
+ distro==1.9.0
35
+ # via openai
36
+ dnspython==2.6.1
37
+ # via email-validator
38
+ email-validator==2.1.1
39
+ # via fastapi
40
+ fastapi==0.111.0
41
+ # via
42
+ # fastapi-cli
43
+ # gradio
44
+ fastapi-cli==0.0.3
45
+ # via fastapi
46
+ ffmpy==0.3.2
47
+ # via gradio
48
+ filelock==3.14.0
49
+ # via huggingface-hub
50
+ fonttools==4.51.0
51
+ # via matplotlib
52
+ fsspec==2024.3.1
53
+ # via
54
+ # gradio-client
55
+ # huggingface-hub
56
+ gradio==4.29.0
57
+ gradio-client==0.16.1
58
+ # via gradio
59
+ h11==0.14.0
60
+ # via
61
+ # httpcore
62
+ # uvicorn
63
+ httpcore==1.0.5
64
+ # via httpx
65
+ httptools==0.6.1
66
+ # via uvicorn
67
+ httpx==0.27.0
68
+ # via
69
+ # fastapi
70
+ # gradio
71
+ # gradio-client
72
+ # openai
73
+ huggingface-hub==0.23.0
74
+ # via
75
+ # gradio
76
+ # gradio-client
77
+ idna==3.7
78
+ # via
79
+ # anyio
80
+ # email-validator
81
+ # httpx
82
+ # requests
83
+ importlib-resources==6.4.0
84
+ # via gradio
85
+ jinja2==3.1.4
86
+ # via
87
+ # altair
88
+ # fastapi
89
+ # gradio
90
+ jsonschema==4.22.0
91
+ # via altair
92
+ jsonschema-specifications==2023.12.1
93
+ # via jsonschema
94
+ kiwisolver==1.4.5
95
+ # via matplotlib
96
+ markdown-it-py==3.0.0
97
+ # via rich
98
+ markupsafe==2.1.5
99
+ # via
100
+ # gradio
101
+ # jinja2
102
+ matplotlib==3.8.4
103
+ # via gradio
104
+ mdurl==0.1.2
105
+ # via markdown-it-py
106
+ numpy==1.26.4
107
+ # via
108
+ # altair
109
+ # contourpy
110
+ # gradio
111
+ # matplotlib
112
+ # pandas
113
+ openai==1.28.0
114
+ orjson==3.10.3
115
+ # via
116
+ # fastapi
117
+ # gradio
118
+ packaging==24.0
119
+ # via
120
+ # altair
121
+ # gradio
122
+ # gradio-client
123
+ # huggingface-hub
124
+ # matplotlib
125
+ pandas==2.2.2
126
+ # via
127
+ # altair
128
+ # gradio
129
+ pillow==10.3.0
130
+ # via
131
+ # gradio
132
+ # matplotlib
133
+ pydantic==2.7.1
134
+ # via
135
+ # fastapi
136
+ # gradio
137
+ # openai
138
+ pydantic-core==2.18.2
139
+ # via pydantic
140
+ pydub==0.25.1
141
+ # via gradio
142
+ pygments==2.18.0
143
+ # via rich
144
+ pyparsing==3.1.2
145
+ # via matplotlib
146
+ python-dateutil==2.9.0.post0
147
+ # via
148
+ # matplotlib
149
+ # pandas
150
+ python-dotenv==1.0.1
151
+ # via uvicorn
152
+ python-multipart==0.0.9
153
+ # via
154
+ # fastapi
155
+ # gradio
156
+ pytz==2024.1
157
+ # via pandas
158
+ pyyaml==6.0.1
159
+ # via
160
+ # gradio
161
+ # huggingface-hub
162
+ # uvicorn
163
+ referencing==0.35.1
164
+ # via
165
+ # jsonschema
166
+ # jsonschema-specifications
167
+ requests==2.31.0
168
+ # via huggingface-hub
169
+ rich==13.7.1
170
+ # via typer
171
+ rpds-py==0.18.1
172
+ # via
173
+ # jsonschema
174
+ # referencing
175
+ ruff==0.4.4
176
+ # via gradio
177
+ semantic-version==2.10.0
178
+ # via gradio
179
+ shellingham==1.5.4
180
+ # via typer
181
+ six==1.16.0
182
+ # via python-dateutil
183
+ sniffio==1.3.1
184
+ # via
185
+ # anyio
186
+ # httpx
187
+ # openai
188
+ starlette==0.37.2
189
+ # via fastapi
190
+ tomlkit==0.12.0
191
+ # via gradio
192
+ toolz==0.12.1
193
+ # via altair
194
+ tqdm==4.66.4
195
+ # via
196
+ # huggingface-hub
197
+ # openai
198
+ typer==0.12.3
199
+ # via
200
+ # fastapi-cli
201
+ # gradio
202
+ typing-extensions==4.11.0
203
+ # via
204
+ # fastapi
205
+ # gradio
206
+ # gradio-client
207
+ # huggingface-hub
208
+ # openai
209
+ # pydantic
210
+ # pydantic-core
211
+ # typer
212
+ tzdata==2024.1
213
+ # via pandas
214
+ ujson==5.9.0
215
+ # via fastapi
216
+ urllib3==2.2.1
217
+ # via
218
+ # gradio
219
+ # requests
220
+ uvicorn==0.29.0
221
+ # via
222
+ # fastapi
223
+ # fastapi-cli
224
+ # gradio
225
+ uvloop==0.19.0
226
+ # via uvicorn
227
+ watchfiles==0.21.0
228
+ # via uvicorn
229
+ websockets==11.0.3
230
+ # via
231
+ # gradio-client
232
+ # uvicorn
resume.code-workspace CHANGED
@@ -1,4 +1,3 @@
1
- // https://code.visualstudio.com/docs/getstarted/settings
2
  {
3
  "folders": [
4
  {
@@ -7,23 +6,22 @@
7
  ],
8
  "settings": {
9
  "editor.formatOnSave": true,
10
- "python.defaultInterpreterPath": ".venv/bin/python3",
11
  "[python]": {
12
  "editor.codeActionsOnSave": {
13
  "source.organizeImports": "explicit"
14
  },
15
- "editor.defaultFormatter": "ms-python.black-formatter"
16
  },
17
  },
18
  "extensions": {
19
  "recommendations": [
 
20
  "dchanco.vsc-invoke",
21
- "ms-python.black-formatter",
22
- "ms-python.isort",
23
- "ms-python.pylint",
24
  "ms-python.python",
25
  "ms-python.vscode-pylance",
26
- "ms-python.mypy-type-checker",
27
  ]
28
  }
29
  }
 
 
1
  {
2
  "folders": [
3
  {
 
6
  ],
7
  "settings": {
8
  "editor.formatOnSave": true,
9
+ "python.defaultInterpreterPath": ".venv/bin/python",
10
  "[python]": {
11
  "editor.codeActionsOnSave": {
12
  "source.organizeImports": "explicit"
13
  },
14
+ "editor.defaultFormatter": "charliermarsh.ruff",
15
  },
16
  },
17
  "extensions": {
18
  "recommendations": [
19
+ "charliermarsh.ruff",
20
  "dchanco.vsc-invoke",
21
+ "ms-python.mypy-type-checker",
 
 
22
  "ms-python.python",
23
  "ms-python.vscode-pylance",
24
+ "redhat.vscode-yaml",
25
  ]
26
  }
27
  }
tasks/__init__.py CHANGED
@@ -1,12 +1,11 @@
1
- """Task collections for the project."""
2
- # pylint: disable=redefined-builtin
3
  # mypy: ignore-errors
4
 
5
  # %% IMPORTS
6
 
7
  from invoke import Collection
8
 
9
- from . import check, clean, convert, format, install, run
10
 
11
  # %% NAMESPACES
12
 
@@ -14,9 +13,9 @@ ns = Collection()
14
 
15
  # %% COLLECTIONS
16
 
17
- ns.add_collection(run, default=True)
18
- ns.add_collection(check)
19
- ns.add_collection(clean)
20
- ns.add_collection(convert)
21
- ns.add_collection(format)
22
- ns.add_collection(install)
 
1
+ """Task collections."""
 
2
  # mypy: ignore-errors
3
 
4
  # %% IMPORTS
5
 
6
  from invoke import Collection
7
 
8
+ from . import checks, cleans, formats, installs, runs
9
 
10
  # %% NAMESPACES
11
 
 
13
 
14
  # %% COLLECTIONS
15
 
16
+
17
+ ns.add_collection(checks)
18
+ ns.add_collection(cleans)
19
+ ns.add_collection(formats)
20
+ ns.add_collection(installs)
21
+ ns.add_collection(runs, default=True)
tasks/{check.py → checks.py} RENAMED
@@ -1,5 +1,4 @@
1
  """Check tasks for the project."""
2
- # pylint: disable=redefined-builtin
3
 
4
  # %% IMPORTS
5
 
@@ -12,20 +11,19 @@ from invoke.context import Context
12
  @task
13
  def type(ctx: Context) -> None:
14
  """Check the types with mypy."""
15
- ctx.run(f"{ctx.venv.python} -m mypy {ctx.python.files}")
16
 
17
 
18
  @task
19
  def code(ctx: Context) -> None:
20
- """Check the codes with pylint."""
21
- ctx.run(f"{ctx.venv.python} -m pylint {ctx.python.files}")
22
 
23
 
24
  @task
25
  def format(ctx: Context) -> None:
26
- """Check the formats with isort and black."""
27
- ctx.run(f"{ctx.venv.python} -m isort --check {ctx.python.files}")
28
- ctx.run(f"{ctx.venv.python} -m black --check --quiet {ctx.python.files}")
29
 
30
 
31
  @task(pre=[type, code, format], default=True)
 
1
  """Check tasks for the project."""
 
2
 
3
  # %% IMPORTS
4
 
 
11
  @task
12
  def type(ctx: Context) -> None:
13
  """Check the types with mypy."""
14
+ ctx.run("mypy *.py")
15
 
16
 
17
  @task
18
  def code(ctx: Context) -> None:
19
+ """Check the codes with ruff check."""
20
+ ctx.run("ruff check *.py")
21
 
22
 
23
  @task
24
  def format(ctx: Context) -> None:
25
+ """Check the formats with ruff format."""
26
+ ctx.run("ruff format --check *.py")
 
27
 
28
 
29
  @task(pre=[type, code, format], default=True)
tasks/{clean.py → cleans.py} RENAMED
@@ -1,5 +1,4 @@
1
  """Clean tasks for the project."""
2
- # pylint: disable=redefined-builtin
3
 
4
  # %% IMPORTS
5
 
@@ -12,27 +11,32 @@ from invoke.context import Context
12
  @task
13
  def install(ctx: Context) -> None:
14
  """Clean the install."""
15
- ctx.run(f"rm -rf {ctx.venv.path}")
16
 
17
 
18
  @task
19
  def mypy(ctx: Context) -> None:
20
  """Clean the mypy cache."""
21
- ctx.run(f"rm -rf {ctx.mypy.cache}")
 
 
 
 
 
 
22
 
23
 
24
  @task
25
  def python(ctx: Context) -> None:
26
  """Clean python files and folders."""
27
- ctx.run("find . -type f -name '*.py[co]' -delete")
28
  ctx.run("find . -type d -name __pycache__ -delete")
29
 
30
 
31
- @task(pre=[mypy, python], default=True)
32
  def all(_: Context) -> None:
33
  """Run all clean tasks."""
34
 
35
 
36
- @task(pre=[all, install])
37
  def reset(_: Context) -> None:
38
  """Reset the project state."""
 
1
  """Clean tasks for the project."""
 
2
 
3
  # %% IMPORTS
4
 
 
11
  @task
12
  def install(ctx: Context) -> None:
13
  """Clean the install."""
14
+ ctx.run("rm -rf .venv/")
15
 
16
 
17
  @task
18
  def mypy(ctx: Context) -> None:
19
  """Clean the mypy cache."""
20
+ ctx.run("rm -rf .mypy_cache/")
21
+
22
+
23
+ @task
24
+ def ruff(ctx: Context) -> None:
25
+ """Clean the ruff cache."""
26
+ ctx.run("rm -rf .ruff_cache/")
27
 
28
 
29
  @task
30
  def python(ctx: Context) -> None:
31
  """Clean python files and folders."""
 
32
  ctx.run("find . -type d -name __pycache__ -delete")
33
 
34
 
35
+ @task(pre=[mypy, ruff, python], default=True)
36
  def all(_: Context) -> None:
37
  """Run all clean tasks."""
38
 
39
 
40
+ @task(pre=[install, all])
41
  def reset(_: Context) -> None:
42
  """Reset the project state."""
tasks/convert.py DELETED
@@ -1,37 +0,0 @@
1
- """Convert files for the project."""
2
- # pylint: disable=redefined-builtin
3
-
4
- # %% IMPORTS
5
-
6
- from invoke import task
7
- from invoke.context import Context
8
-
9
- # %% TASKS
10
-
11
-
12
- @task
13
- def linkedin(ctx: Context) -> None:
14
- """Convert the LinkedIn files."""
15
- ctx.run(
16
- f"""pandoc --to=plain --from=html \
17
- --output={ctx.linkedin.text} \
18
- {ctx.linkedin.html}
19
- """
20
- )
21
-
22
-
23
- @task
24
- def database(ctx: Context) -> None:
25
- """Import files to the database."""
26
- ctx.run(
27
- f"""{ctx.venv.python} database.py \
28
- --database={ctx.database.path} \
29
- --collection={ctx.database.collection} \
30
- {ctx.linkedin.markdown}
31
- """
32
- )
33
-
34
-
35
- @task(pre=[linkedin], default=True)
36
- def all(_: Context) -> None:
37
- """Run all convert tasks."""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
tasks/{format.py → formats.py} RENAMED
@@ -1,5 +1,4 @@
1
  """Format tasks for the project."""
2
- # pylint: disable=redefined-builtin
3
 
4
  # %% IMPORTS
5
 
@@ -11,14 +10,14 @@ from invoke.context import Context
11
 
12
  @task
13
  def imports(ctx: Context) -> None:
14
- """Format code imports with isort."""
15
- ctx.run(f"{ctx.venv.python} -m isort {ctx.python.files}")
16
 
17
 
18
  @task
19
  def sources(ctx: Context) -> None:
20
- """Format code sources with black."""
21
- ctx.run(f"{ctx.venv.python} -m black {ctx.python.files}")
22
 
23
 
24
  @task(pre=[imports, sources], default=True)
 
1
  """Format tasks for the project."""
 
2
 
3
  # %% IMPORTS
4
 
 
10
 
11
  @task
12
  def imports(ctx: Context) -> None:
13
+ """Format code imports with ruff."""
14
+ ctx.run("ruff check --select I --fix *.py")
15
 
16
 
17
  @task
18
  def sources(ctx: Context) -> None:
19
+ """Format code sources with ruff."""
20
+ ctx.run("ruff format *.py")
21
 
22
 
23
  @task(pre=[imports, sources], default=True)
tasks/{install.py → installs.py} RENAMED
@@ -1,5 +1,4 @@
1
  """Install tasks for the project."""
2
- # pylint: disable=redefined-builtin
3
 
4
  # %% IMPORTS
5
 
@@ -12,21 +11,28 @@ from invoke.context import Context
12
  @task
13
  def venv(ctx: Context) -> None:
14
  """Create a virtual environment."""
15
- ctx.run(f"{ctx.python.path} -m venv {ctx.venv.path}")
 
 
 
 
 
 
 
16
 
17
 
18
  @task
19
  def main(ctx: Context) -> None:
20
  """Install the main dependencies."""
21
- ctx.run(f"{ctx.venv.python} -m pip install -r {ctx.pip.requirements}")
22
 
23
 
24
  @task
25
  def dev(ctx: Context) -> None:
26
  """Install the development dependencies."""
27
- ctx.run(f"{ctx.venv.python} -m pip install -r {ctx.pip.requirements_dev}")
28
 
29
 
30
- @task(pre=[venv, main, dev], default=True)
31
  def all(_: Context) -> None:
32
  """Run all install tasks."""
 
1
  """Install tasks for the project."""
 
2
 
3
  # %% IMPORTS
4
 
 
11
  @task
12
  def venv(ctx: Context) -> None:
13
  """Create a virtual environment."""
14
+ ctx.run("python3 -m venv .venv/")
15
+ ctx.run(".venv/bin/pip install uv")
16
+
17
+
18
+ @task
19
+ def lock(ctx: Context) -> None:
20
+ """Lock the main project dependencies."""
21
+ ctx.run("uv pip compile requirements-main.txt -o requirements.txt")
22
 
23
 
24
  @task
25
  def main(ctx: Context) -> None:
26
  """Install the main dependencies."""
27
+ ctx.run("uv pip install -r requirements.txt")
28
 
29
 
30
  @task
31
  def dev(ctx: Context) -> None:
32
  """Install the development dependencies."""
33
+ ctx.run("uv pip install -r requirements-dev.txt")
34
 
35
 
36
+ @task(pre=[venv, lock, main, dev], default=True)
37
  def all(_: Context) -> None:
38
  """Run all install tasks."""
tasks/{run.py → runs.py} RENAMED
@@ -1,5 +1,4 @@
1
  """Run tasks for the project."""
2
- # pylint: disable=redefined-builtin
3
 
4
  # %% IMPORTS
5
 
@@ -9,7 +8,12 @@ from invoke.context import Context
9
  # %% TASKS
10
 
11
 
12
- @task(default=True)
13
  def app(ctx: Context) -> None:
14
  """Run the main application."""
15
- ctx.run(f"gradio {ctx.app.path}")
 
 
 
 
 
 
1
  """Run tasks for the project."""
 
2
 
3
  # %% IMPORTS
4
 
 
8
  # %% TASKS
9
 
10
 
11
+ @task
12
  def app(ctx: Context) -> None:
13
  """Run the main application."""
14
+ ctx.run("gradio app.py")
15
+
16
+
17
+ @task(pre=[app], default=True)
18
+ def all(_: Context) -> None:
19
+ """Run all run tasks."""